快速排序使用分治法的策略来把一个待排序数组分成两个部分,事先定义好一个基准数,左边为小于该基准数的,而右边则是大于基准数。步骤为:
从数组中挑出一个元素,成为基准数;
重新排序数列,所有元素比基准数小的放在基准数前面,所有元素比基准数大的放在基准数的后面(相同的数可以放到任一边)。在这个分区退出来之后,该基准数就位于该数列的中间位置。这个操作成为分区(partition),是快排的核心;
递归地把小于基准数元素的子数列和大于基准数元素的子数列排序。
此算法可以用代码被表示为:
void quickSort(int a[],int p,int r)
{
if(p
{
int i, m;
if (p >=r) return;
m = p;
for (i = p+1; i <= r; i++)
if (x[i] < x[l])
swap(++m, i);
swap(p, m);
quickSort(a,p,m-1);
quickSort(a,m+1,r);
}
快速排序最大的不足就是对于相对有序的数组排序效率很低,而且当数组较短时快速排序并不是最快的。应对这些情况有三种简单常用的改进:
随机化改进:不是选取第一个值为基准,而是随机选取。
平衡化改进:取第一个、最后一个和中间点三个值中中间值为基准进行排序。
设置阀值--混合排序:当数组长度小于某一值时使用其他较快的排序。