问题:序列中有较多相同元素值时,随机化快排的性能下降
思路:PARTION将序列分为三个部分A(p,q,t,r),A[p,...,q-1]中元素都小于A[q],A[q,...,t]中元素都相等,A[t+1,...,r]中元素都大于A[q]。QUICKSORT只对分区内互不相同的元素才做递 归。
代码:
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
void Swap(int &a, int &b)//交换两个数的函数
{
int temp=b;
b=a;
a=temp;
}
int* New_Partition(int *A, int p, int r) //新的分区函数
{
int *index=new int[2];
int k=rand()%(r-p+1)+p;//随机化快排
Swap(A[k],A[r]);
int i=p-1;
for(int j=p;j<r;j++) //把比主元小的元素都排到前面
{
if (A[j]<A[r])
{
++i;
Swap(A[i],A[j]);
}
}
index[0]=i+1;//记录相等元素开始的下标
for(int l=i+1;l<r;l++)//再把和主元相等的元素排到中间
{
if (A[l]==A[r])
{
++i;
Swap(A[l],A[i]);
}
}
index[1]=i+1;//记录相等元素结束的下标
Swap(A[i+1],A[r]);
return index;
}
void QuickSort(int *A, int p, int r)
{
if(p < r)
{
int *new_index= New_Partition(A, p, r);
QuickSort(A, p, new_index[0]-1);
QuickSort(A, new_index[1]+1, r);
delete [] new_index;
}
}
int main()
{
int A[9]={2,1,3,5,8,4,1,4,4};
for(int m=0;m<=8;m++)
cout<<A[m]<<" ";
cout<<endl;
srand((unsigned)time(NULL));
QuickSort(A,0,8);
for(int n=0;n<=8;n++)
cout<<A[n]<<" ";
cout<<endl;
return 0;
}