3.先开始从数组后面找到第一个比哨兵小的元素 A ,将其填入哨兵值的下标的位置上面(记住 不是替换哨兵值 ),此时元素 A 的位置空了出来
4.再从数组最前面开始找到第一个比哨兵大的元素 B ,将其填入上一步 元素A空出来的位置
5.循环 3 4两步 直到前后碰面后,将哨兵值放入值那个最后元素下标位置
6.此时哨兵值左边全是小于它的数,右边全是大于它的数,对两边进行递归调用,完成排序。
#include<iostream>
using namespace std;
void quicksort(int a[],int low,int high){
if(low>=high){//碰面了 此时已经分割完毕
return;
}
int first=low;
int last=high;
int key=a[first];//定义一个轴点
while(first<last){
while(first<last&&a[last]>=key){
--last;//先从最右边开始找 如果没有找到比key小的值就一直减少
}
a[first]=a[last];//在右边找到了第一个比Key小的值 将其移到first的位置
while(first<last&&a[first]<=key){//然后再从最左边开始找 如果没有找到比Key大的值就一直增大
++first;
}
a[last]=a[first];//在左边找到了第一个比Key大的值 将其移到last空缺的位置
}
a[first]=key;//此时将枢轴记录到位 归位 此时a[first](Key值)左侧全是比其小的数,右侧全是比其大的数
quicksort(a,low,first-1);
quicksort(a,first+1,high);//将左右两部分尚未排完序的部分继续递归
}
int main(){
int a[]={23,55,66,24,63,43,27,77};
quicksort(a,0,7);
for(int i=0;i<8;i++){
cout<<a[i]<<" ";
}
return 0;
}
时间复杂度:最坏情况下效率为O(
n
2
n^2
n2),每次平分完后,只能分成一个元素和剩余其他元素,退化成了冒泡排序的情况 大多数情况下,根据递归树深度
l
o
g
2
n
+
1
log_2n+1
log2n+1,递归
l
o
g
2
n
log_2n
log2n次,快速排序算法的平均效率可以达到O(nlogn)。