快排,O(nlog n) 期望时间,O(n^2) 最坏情况; 对于大的、乱数列表一般相信是最快的已知排序
不稳定的排序,需要输入无关时要用到随机化过程
template<class T>
int Partition(T A[],int p, int r)
{
T x = A[r];
int i = p-1;
for(int j=p;j<=r-1;j++)
{
if(A[j]<= x)
{
++i;
swap(A[i],A[j]);
}
}
swap(A[r],A[i+1]);
return i+1;
}
template<class T>
void QuickSort(T A[],int p, int r)
{
if(p<r)
{
int q = Partition(A,p,r);
QuickSort(A,p,q-1);
QuickSort(A,q+1,r);
}
}
以下用到了随机化过程
template<class T>
int Partition(T A[],int p, int r)
{
T x = A[r];
int i = p-1;
for(int j=p;j<=r-1;j++)
{
if(A[j]<= x)
{
++i;
swap(A[i],A[j]);
}
}
swap(A[r],A[i+1]);
return i+1;
}
template<class T>
int RandomizedPartition(T A[],int p, int r)
{
int i = rand()%(r-p+1)+p;
swap(A[i],A[r]);
return Partition(A,p,r);
}
template<class T>
void QuickSort(T A[],int p, int r)
{
if(p<r)
{
int q = RandomizedPartition(A,p,r);
QuickSort(A,p,q-1);
QuickSort(A,q+1,r);
}
}