昨天讨论的随机化快排对有重复元素的数组会陷入无限循环。今天带来对其的优化,使其支持重复元素。
只需修改partition函数即可:
int partition(int *numArray,int head,int tail)
{
int pivot=numArray[tail];
int i=head-;
int j=tail;
while(true)
{
do
{
i++;
}while(i<=tail&&numArray[i]<pivot); //找到比主元大的元素
do
{
j--;
}while(numArray[j]>pivot); //找到比主元小的元素
if(j<i)
break;
swap(numArray,i,j); //交换,使比主元小的元素在左边,比主元大的元素在右边
}
swap(numArray,j+,tail);
return j+;
}
算法测试:
#include "stdafx.h"
#include <iostream>
#include "RandomizedQuickSort.h" using namespace std;
using namespace dksl;
int _tmain(int argc, _TCHAR* argv[])
{
int a[] = {, , , , , , , , , };
randomizedQuickSort(a,,);
for(int i=;i<;i++)
cout<<a[i]<< " ";
cout<<endl;
system("PAUSE");
return ;
}