[英]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的訂單如下:
會發生什么,是left+(right-left)>>1
被視為(left+(right-left))>>1
,它不相等,而是right >> 1
或right / 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.