改进快速排序

时间:2015-03-19 08:07:55

标签: c++ algorithm quicksort

当有很多项目副本时,快速排序算法会有不良行为。(我的意思是我们有重复数据)。如何解决此问题的解决方法。

int partition (int low,int high)
{
 int j=low,i=low+1;
 int PivotItem=arr[low];
  for(int i=0,j=0;i<n;i++)
 {
    if(arr[i]==PivotItem)
     subarray[j]=arr[i];
 }
 for(i=low+1;i<=high;i++)
{
    if(arr[i]<PivotItem)
    {
        j++;
        swap(arr[i],arr[j]);
    }
}
swap(arr[low],arr[j]);
int PivotPoint=j;
return PivotPoint;
}
void quick_sort(int low,int high)
{
if(low==high)
    return ;
int PivotPoint=partition(low,high);
quick_sort(low,PivotPoint-1);
quick_sort(PivotPoint+1,high);
}

2 个答案:

答案 0 :(得分:3)

QuickSort的特殊修改称为dutch flag sort algorithm。对于小于,等于和大于枢轴项值的项目,它使用三向分区。

答案 1 :(得分:2)

我认为你的意思是快速排序比较基于<=(或<的元素,然后结果与下一个解释对称)比较器的元素,如果我们看一下所有元素都与pivot x相同,因为您将数组拆分为两个非偶数部分,一个是大小为n-1,另一个是空的。 / p>


解决此问题的快速解决方法是仅使用<>快速排序 - 将数据拆分为两个子数组,而而不是单个数据透视,保持一个包含所有等于pivot 的元素的数组,然后递归到严格大于pivot的元素,以及严格小于pivot的元素,并组合三个数组。

插图:

legend: X=pivot, S = smaller than pivot, L = larger than pivot
array = |SLLLSLXLSLXSSLLXLLLSSXSSLLLSSXSSLLLXSSL|
Choose pivot - X
Create L array of only strictly smaller elements:  |SSSSSSSSSSSSSSS|
Create R array of only strictly larger elements: |LLLLLLLLLLLLLLLLLL|
Create "pivot array" |XXXXXX|

Now, recurse on L, recurse on R, and combine:
|SSSSSSSSSSSSSSS XXXXXX LLLLLLLLLLLLLLLLLL|