簡體   English   中英

如何更改我的快速排序代碼以使用數組的最后一個元素作為 pivot?

[英]How do I change my Quicksort code to use the last element of my array as the pivot?

有人可以解釋一下我如何更改以下代碼以將數組的最后一個元素用作 pivot? 在這個代碼示例中,我使用第一個元素作為我的 pivot。

我發現了一些其他代碼,但它們以不同的方式對數組進行排序,這不是我想要的。

在我嘗試將 pivot 更改為使用最后一個元素時,我沒有收到錯誤代碼,但在我的數組中間排序失敗。 很感謝任何形式的幫助。

int partition(vector<int>& v,int low, int high){
    int pivot = v[low];
    int ui{low};
    int oi{high + 1};
    
    while(true){

        while(v[++ui] < pivot){
            if(ui == high){
                break;
            }
        }
        
        while(pivot<v[--oi]){
            if(oi == low){
                break;
            }
        }
        
        if(ui >= oi){
            break;
        }
        swap(v[ui],v[oi]);
    }
    
    swap(v[low],v[oi]);
    
    return oi;
}

void quicksort(vector<int>& v, int low, int high){
    
    if(high>low){
        
        int pivot = partition(v,low,high);
        
        quicksort(v,low, pivot - 1);
        quicksort(v,pivot + 1,high);
    }
}

您選擇 pivot 的位置並不重要。 重要的是你選擇了一個。 您甚至可以每次隨機選擇一個。

選擇 pivot 后,您可以開始移動元素,使用 pivot 所在的位置作為最初未使用的位置,在洗牌時移動到位置。

完成分區后,未使用的移動位置應位於左右兩側之間。 將 pivot 值粘貼在那里,並將該點的索引返回給調用者。

要從使用low作為 pivot 索引切換到使用high ,您需要進行以下更改:

int partition(vector<int>& v,int low, int high){
    // before:
    //int pivot = v[low];
    //int ui{low};
    //int oi{high + 1};

    // after:
    int pivot = v[high];
    int ui{low - 1};
    int oi{high};

    while(true){

        while(v[++ui] < pivot){
            if(ui == high){
                break;
            }
        }
        
        while(pivot<v[--oi]){
            if(oi == low){
                break;
            }
        }
        
        if(ui >= oi){
            break;
        }
        swap(v[ui],v[oi]);
    }
    
    //before:
    //swap(v[low],v[oi]);
    
    //after:
    swap(v[high],v[oi]);
    
    return oi;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM