快速排序
- 核心思想:
快速排序就是立一个数作为基准数,比他小的统统放左边,比他大的统统放在他的右边,接着通过递归,对它的左边序列,右边序列重复此过程,直到无数可分
- 复杂度分析
- 最好情况:
O(nlogn)
- 最差情况:
O(n^2)
- 平均情况:
O(nlogn)
- 辅助空间:
O(logn)~O(n)
- 稳定性:
不稳定
- 最好情况:
图解
如序列{6,1,2,7,9,3,4,5,10,8}
6作为基准数
,左右安排两个哨兵i,j
哨兵i
碰到比6小的
就一路向右走(碰到比6大的就停下),哨兵j
碰到比6大的
,就一路向左走(碰到比6小的停下)
两者都停下时就进行交换,交换后的效果如下
接着两哨兵继续走,
两者都停下时便交换
直到两者相遇
此时可以选择和基准数交换位置
此时,以6为基准数的排序就完成了,接着以3为基准数重复此过程,再一下一个基准数重复,直到有序
完整过程如下图
代码如下
#include <iostream>
void swap(int *&arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
int sortCore(int *arr,int start,int end){//快速排序
int i=start;
int j=end;
int temp=arr[start];
while(i!=j){//定义两个一头一尾的哨兵
while(arr[j]>temp){//尾哨兵从后往前扫描,碰到比基准数大的就往前走
j--;
}
while(arr[i]<temp){//头哨兵从前往后扫,碰到比基准数小的往后走
i++;
}
swap(arr,i,j);
}
return i;
}
void quickSort(int *arr,int start,int end){
int i;
if(start<end){
i=sortCore(arr,start,end);
quickSort(arr,start,i-1);
quickSort(arr,i+1,end);
}
}
int main(int argc, char** argv) {
int arr[]={2,23,54,12,13,64,7,10};
quickSort(arr,0,7);
for(int i=0;i<8;i++){
printf("%d ",arr[i]);
}
return 0;
}
注:本文所用图均来自
啊哈磊大神的博客