第十四天:快速排序

今天是释然发题解的第十四天,以后每一天都会和大家分享学习路上的心得,希望和大家一起进步,一起享受coding的乐趣。
本文约1400字,预计阅读4分钟
昨天我们学习了分治,忘记的小伙伴们可以看一下哦:

[初识分治(https://blog.csdn.net/MATLAB2020ab/article/details/105600173)

今天我们来聊一聊快速排序,明天和大家分享分治的相关例题:

定义:来源菜鸟教程

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

该方法的基本思想是:

1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤。

我的理解

首先随机选择一个数(通常是第一个数),定义两个指针一个是left一个是right,left从第一个数开始往后找,right是从最后一个数开始往前找,当碰到比第一个数小的时候,让a【j】和 a【1】互换,换完以后让i右移,如果a【i】<a【j】就再次交换,知道a【1】左边都比它小,右边都比它大,再递归地调用左侧和右侧,实现快速排序

上面的这个是我的理解,用到的还是分治的思想,因此时间复杂度为nlogn,
空间复杂度为logn,属于非稳定排序,原地排序

快速排序

分治算法里面重要的一个应用就是快速排序:
又分为:找到中介+递归(递归的思想)

//首先我们写一个交换函数,因为要找到中介,所以中介需要和很多数交换位置
void swap(int *x, int *y)
{
    int tem;
    tem = *x;
    *x = *y;
    *y = tem;
}

接下来是快速排序的主体:从a【left】开始到a【right】结束

void quicksort(int a[], int left, int right)
{
    if (left >= right)
        return;
    int t=a[left];
    int i = left, j = right;
    while (i != j)
    {
        while (j > i && a[j] > t)
            j--;
        swap(a[j], t);
        while (j > i && a[i] < t)
            i++;
        swap(a[i], t);
    }
    quicksort(a,left,i-1);
    quicksort(a,i+1,right);
}

总的来说应该是比较好理解的,就是先一个中间量,然后递归左边& 右边

好了,今天的有关快速排序的知识就到这里
释然每天发布一点自己学习的知识,希望2年后我们也能在ACM的赛场上见面,一起去追寻自己的程序猿之路吧!

后期也会和大家一起分享学习心得和学习经验呢,明天我们不见不散哦!

下期预告:

分治的相关例题

如果大家有什么建议或者要求请后台留言,释然也想和大家一起进步呀!
联系方式:shirandexiaowo@foxmail.com

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shirandexiaowo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值