快速排序的改进

Improvement of quick sort

本文关键字:快速排序      更新时间:2023-10-16

当有许多项的副本时,快速排序算法会有不良行为。(我的意思是我们有重复的数据)。如何改进这个问题已经解决了。

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);
}

QuickSort有一个特殊的修改,称为dutch标志排序算法。它对小于、等于和大于透视项目值的项目使用三元分区。

我假设你的意思是,快速排序基于<=(或<,然后结果与下一个解释对称)比较器比较元素,如果我们看看所有元素都与枢轴x相同的情况,你会得到快速排序最坏的复杂度,因为你将数组分成两个非常不均匀的部分,一个大小为n-1,而另一个是空的。


解决此问题的快速解决方案是仅对<>使用快速排序-将数据拆分为两个子数组,并且而不是单个pivot,保持一个包含所有等于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|