自己尝试着实现的QuickSort,并且每次的关键点不是数组的最后一个元素,而是用随机数得出随机的下标,然后把下标对应的元素当成关键点。还是那句 话,本人菜鸟,请多多指教~~~^^
//交换两个数
template<class T>
void Exchange(T &a,T &b)
{
T tmp;
tmp=a;
a=b;
b=tmp;
}
//分解并重排
template<class T>
int Partition(T A[],int p,int r)
{
//随机获取划分点的下标,每次获取后,
//与本数组的最后一个元素交换,
//划分点用x标记
int s;
srand(time(0));
s=p+rand()%(r-p+1);
Exchange(A[r],A[s]);
T x=A[r];
int i=p-1;
for(int j=p;j<r;j++)
{
if(A[j]<=x)
{
i++;
Exchange(A[i],A[j]);
}
}
Exchange(A[r],A[i+1]);
return i+1;
}
//QuickSort
template<class T>
void QuickSort(T A[],int p,int r)
{
int q;
if(p<r)
{
q=Partition(A,p,r);
QuickSort(A,p,q-1);
QuickSort(A,q+1,r);
}
}
//测试
void main()
{
int A[]={3,45,78,2,45,89,7,12,9,10};
int len=sizeof(A)/sizeof(int);
QuickSort(A,0,len-1);
for(int i=0;i<len;i++)
cout<<A[i]<<endl;
}
写这个的步骤是先按照数组的最后一个元素为关键点来写的,然后为了更接近于平均情况,采用了随机获取。然后就开始头大了==!一直排不对,出去走了两圈, 回来才发现获取随机数的时候,每次的范围都是从0开始的。唉,当时也不知道怎么了。。。。看来时不时的活动一下还是很有帮助哒~~~^^