快速排序分区功能
Posted
技术标签:
【中文标题】快速排序分区功能【英文标题】:Quick Sort partition function 【发布时间】:2014-03-16 01:44:52 【问题描述】:我想问一个关于快速排序分区函数()的问题。如果我替换语句
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;
【问题讨论】:
【参考方案1】:问题在于运算符的优先级。
你使用的3个的顺序如下:
-
乘法
添加剂
换档
发生的情况是,left+(right-left)>>1
被视为(left+(right-left))>>1
,这是不相等的,而只是right >> 1
或right / 2
。
您可以在此处查看优先级:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html
【讨论】:
谢谢!我得到它!优先级问题! 发生在我们最好的人身上【参考方案2】:有
int pivot = arr[left+(right-left)>>1];
你真的在写
int pivot = arr[(left+(right-left))/2];
等于
int pivot = arr[right/2];
因此,您选择的枢轴元素与第一个代码中的不同。尽管如此,只要您选择的枢轴元素在当前子数组的范围内,快速排序就应该返回正确的解决方案。通过您的修改,您最终将选择一个不在当前子数组中的枢轴元素。
【讨论】:
谢谢!我得到它!这是优先级问题! 正如 Niklas B. 所写:发生在任何人身上。 ;)以上是关于快速排序分区功能的主要内容,如果未能解决你的问题,请参考以下文章