快速排序算法

思想

分而治之

void quickSort(int *begin,int *end)
{
    int *p = begin;// 保存初始的起始位置
    int *q = end;// 保存初始的结束位置
    int *k = begin;//a[0]基准点,选择数组的第一个元素作为基准

    if(begin >= end)// 基本情况检查:如果起始位置大于或等于结束位置,则返回
    {
        return;
    } 
    while(begin<end) // 主要的划分循环
    {
        while(begin<end && *end>=*k)// 从右向左寻找一个小于或等于基准点的元素
        {
            --end;
        }

        while(begin<end && *begin<=*k)// 从左向右寻找一个大于基准点的元素
        {
            ++begin;
        }
        swap(begin,end);// 交换找到的两个元素,使得左边的元素小于基准点,右边的元素大于基准点
    }
    swap(k,begin);// 将基准点放到正确的位置
    // 递归调用,对基准点左边和右边的子数组进行排序
    quickSort(p,end-1);
    quickSort(begin+1,q);
}

实现思路


1.基准值选择

基准值 ——数组首元素a[0] ——基准值位置

2.从右边开始寻找

使用end指针 从右向左寻找到第一个比基准值小的数

3.从左边开始寻找

使用begin指针 从左向右寻找到第一个比基准值大的数

4.交换元素

将找到这两个数交换


继续重复2-4的过程
直到begin/end相遇,此时结束。

5.基准值交换

当begin和end相遇时,将基准值与当前位置的元素交换

将基准位置上值与此时begin/end所谓位置的元素交换

6.递归排序

继续对左一半和右一半进行快速排序

递归结束的条件

if(begin>=end)
{
    return;
}

算法的时间复杂度

O(nlog(n))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值