当有很多项目副本时,快速排序算法会有不良行为。(我的意思是我们有重复数据)。如何解决此问题的解决方法。
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);
}
答案 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|