簡體   English   中英

快速排序分區功能

[英]Quick Sort partition function

我想問一個快速排序分區函數的問題()。 如果我替換聲明

int pivot = arr[(left + right) / 2];

int pivot = arr[left+(right-left)>>1];

當陣列中存在重復元素時,該算法不起作用。 為什么? 謝謝。

int partition(int arr[], int left, int right) 

{ 

      int i = left, j = right; 

      int tmp; 

      int pivot = arr[(left + right) / 2]; **********        

      while (i <= j) { 

            while (arr[i] < pivot)  i++; 
            while (arr[j] > pivot)  j--; 

            if (i <= j) { 
                  tmp = arr[i]; 
                  arr[i] = arr[j];
                  arr[j] = tmp; 
                  i++; 
                  j--; 
            } 
      }     

      return i; 
} 

問題是運營商的優先順序。

您使用的3的訂單如下:

  1. 添加劑
  2. 轉移

會發生什么,是left+(right-left)>>1被視為(left+(right-left))>>1 ,它不相等,而是right >> 1right / 2

您可以在此處查看優先級: http//docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

int pivot = arr[left+(right-left)>>1];

你其實在寫

int pivot = arr[(left+(right-left))/2];

這相當於

int pivot = arr[right/2];

因此,您選擇的是不同於第一個代碼的樞軸元素。 但是,只要您選擇的pivot元素在當前子數組的范圍內,快速排序就應該返回正確的解決方案。 通過修改,您最終將選擇一個不在當前子陣列中的pivot元素。

暫無
暫無

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

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