快速排序

快速排序

  • 核心思想:
    快速排序就是立一个数作为基准数,比他小的统统放左边,比他大的统统放在他的右边,接着通过递归,对它的左边序列,右边序列重复此过程,直到无数可分
  • 复杂度分析
    • 最好情况: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;
}

注:本文所用图均来自啊哈磊大神的博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值