[转载] 《算法导论》
1、快速排序的思想
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
2、快速排序的实现
void swap(int *data1, int *data2)
{
int tmp;
tmp = *data1;
*data1 = *data2;
*data2 = tmp;
}
void QuickSort(int *array,int length)
{
if (array == NULL || length < 2)
return;
int indexSmall = -1; //从前往后寻找
int index=0;
while (index < length-1)
{
if (array[index] < array[length - 1]) //参考元素选最后一个
{
indexSmall++;
if (indexSmall != index)
swap(array + indexSmall, array + index);
}
index++;
}
indexSmall++;
swap(array + indexSmall, array + length - 1);
QuickSort(array, indexSmall);
QuickSort(array + indexSmall + 1, length - indexSmall - 1);
}
2、快速排序的性能
1)、时间复杂度
快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较。
最坏情况是O(n^2)。当每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,划分的结果是基准左边的子区间为空(或右边的子区间为空),而划分所得的另一个非空的子区间中记录数目,仅仅比划分前的无序区中记录个数减少一个。
最好情况下O(nlgn)。当每次划分所取的基准都是当前无序区的”中值”记录,划分的结果是基准的左、右两个无序子区间的长度大致相等。总的关键字比较次数:
它的平均时间复杂度为O(nlgn)。尽管快速排序的最坏时间为O(n^2),但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快者,快速排序亦因此而得名。
2)、稳定性
快速排序是不稳定的。
和其它层算法的比较:
快速排序和冒泡排序都是基于比较的排序。