簡體   English   中英

快速排序實現,在C ++中圍繞中位數進行分區

[英]quicksort implementation with partitioning around the median in c++

我努力自己解決這個問題,但是這讓我更加困惑。 我看了那些使用中位數對它進行分區的quicksort示例代碼,並在一個示例數組上嘗試說A = {1,8,4,6,7,10,11},但沒有得到正確的分區。 分區代碼如下:

void swap(int &x, int &y){
    int temp=x;
    x=y;
    y=temp;
 }
//
int partition(int arr[],int low,int high){
int pivot=arr[(low+high)/2];
while(low<=high){
   while(arr[low]<pivot) low++;
   while(arr[high]>pivot) high--;
   if(low<=high){
      swap(arr[low],arr[high]);
      low++;
      high--;
    }
 }
 return low;
}

在我的示例中,pivot是6,因此代碼首先在數組A中交換8和6,然后停止。 它不會將所有小於pivot = 6的較小的值放在該值之前,也不會將所有較大的值放在上面。 我猜問題在於我們假設始終可以從數據透視表的左側和右側找到兩個值進行交換,但是在此示例中,右側很好。 任何意見或想法將不勝感激。
僅有幾處更新:(1)我的重點是快速排序的分區部分,並且我知道執行遞歸方法的以下步驟。(2)即使在此網站中,我也在許多鏈接中看到了這種方法快速排序-中樞實現奇怪的行為 (或在用Java編寫的“破解編碼訪談”書,第119頁)中,他們聲稱它可以工作,但我對此表示懷疑(我的意思是分區部分,由於某種原因,它最終可能會以某種排序的數組結尾但必須實現正確的分區,以便所有小於分區元素的數字都在大於該分區元素的所有元素之前。)在我的示例數組A中,它的結尾為A = {1,6,4,8,7, 10,11},這不是正確的分區,因為4在6(我們的樞軸)之后。

您的分區實現中存在一些明顯的錯誤。 較大的問題之一是您不必重新比較swap的元素。

在Quicksort中進行分區時,只需要在樞軸元素之后移動大於樞軸的元素即可。 因此,一個簡單的實現將是...

int partition(int arr[], int begin, int end) {

  int pivot = arr[begin + ((end - begin) / 2)];

  while (begin != end) {

    if (arr[begin] < pivot)
      begin++;
    else
      swap(arr[begin], arr[end--]);
  }

  return end;
}

注意,復雜度取決於樞軸的質量,這就是為什么中位數是理想的原因。 但是,這將需要遍歷所有元素O(n)

請記住,選擇數組的中間並不總是能很好地解決問題。 有幾種策略可以選擇一個好的支點(隨機化,樣本和中位數,等等)。

暫無
暫無

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

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