快速排序为什么能快呢?
结合分治的策略,在快速排序中当挑出一个基准元素用来分成两部分即大于基准元素和小于基准元素。每次以这种效率分好,显而易见若我们取的基准每次都能恰好的是整个待排序元素的中心。
T(n)=T(n/2)+T(n/2)+O(n)
此递归解易得出 T(n)=O(nlgn)
而最差的情况下
T(n)=T(n-1)+T(0)+O(n)
此时T(n)=O(n^2)
很明显的差距,如何选好一个基准对于快排来说直接关乎其效率。
下面用最简单的方式实现一下快速排序,思想是一致的不同的只是选取基准元素的方式不一样,此处采取最简单的:每次固定取带排序的最后一个元素。
int partition(int *A,int p,int r)
{
int temp=A[r-1];
int i=p,j=p;
for(;j<r-1;j++)
{
if(A[j]<temp)
{
swap(A[i],A[j]);
i++;
}
}
swap(A[i],A[r-1]);
}
void qsort(int *A,int p,int r)
{
if(p<r)
{
int q=partition(A,p,r);
qsort(A,p,q-1);
qsort(A,q+1,r);
}
}
若要是快速排序的效率增高的话,可以使用一个粗略的中位数的方式,即遍历一遍取个差不多中间的数或者直接取随机数也可以。