原理
将待排序的序列分为两部分,选用一个基准值,一部分序列的值大于这个基准值,一部分序列的值小于这个基准值。这样一直递归下去,直到完成整个序列的排序。
实现
void quickSort(int a[],int low,int high)
{
if(low>=high)
return ;
int left,right,key;
left=low;
right=high;
key=a[left];//待排序列第一个元素设置为基准值
while(left<right)
{
//从右边找,直到找到第一个小于基准值的元素,交换到左边
while(left<right&&key<=a[right])
{
right--;
}
a[left]=a[right];
//从左边找,直到找到第一个大于基准值的元素,交换到右边
while(left<right&&key>=a[left])
{
left++;
}
a[right]=a[left];
}
a[left]=key;//基准值放到两个序列中间
quickSort(a,low,left-1);
quickSort(a,left+1,high);
}
说明
实现中选用的基准值是每个待排序列的第一个值。low和high控制序列的边界;left和right不断变化,进行序列划分排序工作。
影响该算法时间效率的主要因素是基准值的选取。最好的情况下选取的基准值为序列中值,最差的情况下选取的基准值为序列最大/小值。算法平均时间复杂度为O(n*log(n)),最差情况下时间复杂度为O(n^2)。