快速排序分区功能

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)&gt;&gt;1 被视为(left+(right-left))&gt;&gt;1,这是不相等的,而只是right &gt;&gt; 1right / 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. 所写:发生在任何人身上。 ;)

以上是关于快速排序分区功能的主要内容,如果未能解决你的问题,请参考以下文章

快速排序实现错误

快速排序分区以及优化方法

快速排序分区以及优化方法

快速排序的错误

你真的懂快速排序吗?

Java快速排序