(1)思想:又称作分区排序。其基本思想为,任取待排序元素中的一个(例如第一个)作为基准,按照该元素的大小,将整个元素序列分为左右两个序列,左侧序列中的元素都小于基准元素,右侧序列中的元素都大于等于基准元素,基准元素排列在中间。然后,分别对左右两个序列重复实行此方法,直到所有元素都在排列位置上为止。
(2)c++实现:
void quickSort(int a[],int start,int end){
if(start<end){
int pivotPos = partition(a,start,end);//把a[start]作为基准点,划分好数组后返回基准点的位置
quickSort(a,start,pivotPos-1);//quickSort左侧子序列
quickSort(a,pivotPos+1,end);//quickSort右侧子序列
}
}
int partition(int a[],int low,int high){
int cursor = a[low];//基准点的数值
/*
开始划分操作
*/
while(low < high){
while(low < high && a[high] >= cursor)//从高位往低位寻找第一个小于基准值的元素的位置
high--;
if(low < high){
swap(a[low],a[high]);
low++;
}
while(low < high && a[low] < cursor)//从低位往高位寻找第一个大于等于基准值的元素的位置
low++;
if(low < high){
swap(a[low],a[high]);
high--;
}
}
a[low] = cursor;
return low;//此时low就是基准点的位置
}
(3)复杂度:排序次数取决于递归树的深度,partition一个元素需要o(n),总共需要partition的次数为logn次,所以时间复杂度为o(nlogn)