你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

快速排序详细介绍

[复制链接]
gaosmile 发布时间:2020-10-20 15:25

上次在面试了一次后台开发的时候,然后在交流群里和小伙伴们交流了一下,发现数据结构和算法手撕代码是大家的弱点(包括我自己也是,对数据结构和算法也没有去系统的学习过,这方面非常差劲!),为此自己趁这段时间比较充裕一点,反正也没啥事,少刷点视频,就顺便来系统学习基本的数据结构和算法了,多掌握点技能,提高自己的思维能力,虽然在实际工作当中去写数据结构或者算法的地方几乎不会用到(当然也跟岗位有关,自身的职业岗位深入有关。。。),还是非常值得去学习,只有好处,没有坏处!

今天给大家分享的是快速排序,最为重要的是学习它的核心思想,其次再是代码实现!

一、快速排序:

1、核心思想

微信图片_20201020152531.png

(1)、确定分界点,可以在上图中的数轴上随便找一个点来作为分界点,当然我们常规的确定分界点方法有:

a、直接取左边界,表示为q[l]

b、取中间值,表示为q[(l+r)/2]

c、取右边界,表示为q[r]

d、这种方法就是随便取了;不过上面三种方法是我们常用的方法!

(2)、调整区间:

微信图片_20201020152537.png

如上图所以,我们把小于等于x的数字放在小于等于x的区间里面去;把大于等于x的数字放在大于等于x的区间里面去

(3)、递归处理左右两端区间

2、具体实现细节分分析:

这里我们用两个指针分别为指针i、指针j,指向数轴上的两端,如下图所示:

微信图片_20201020152540.png

让两个指针都往中间走,这里我们先分析指针i,当指针i指到了小于x的数字,就把它分好位置,继续往下走,直到遇到不符合这个条件,指针i就停止往下访问了;接着我们来分析指针j了,方法一样,当指针j指向的数字大于x的时候,把它分好位置,继续往下走,直到遇到不符合这个条件,指针j就停止往下访问了,这时进行两边数据互换swap();接着继续按照这种方式往下访问,直到排序完成为止!

这样说可能还没听明白,那么我们下面用实际的数字来说话,比如:3、1、2、3、5

微信图片_20201020152543.png

这里我们取分界点为3;我们可以看到指针i先指向3,它刚好等于3(不满足小于3的条件,这里的分界点3不要放入到任何的区间去,不然为啥会叫分界点),所以指针i就先暂停;然后是指针j,我们从图中发现它指向的数字大于3,满足条件,所以先把5放置好位置来,然后继续让指针j往下走:

微信图片_20201020152546.png

这个时候你会发现指针j指向的数字是3,不满足条件,所以进行i和j指向的数字进行交换swap(),这里都是3,所以看不出啥变化来。

交换完后,继续按照原来的方式往下走,指针i和指针j指向的数字如下:

微信图片_20201020152549.png

这个时候我们会发现指针i指向的数字是1,所以符合条件,放置好位置来,继续往下走,你会发现指向数字2,满足条件,同样放置好位置来,然后继续往下走,此时指针i指向的数字是3,不满足条件,就停止下来:

微信图片_20201020152552.png


微信图片_20201020152555.png

这个时候我们分析指针j,它此时指向的数字是2,不符合条件,就停止下来,同时这个时候不能进行交换数据了!

3、代码实现:

微信图片_20201020152558.png

现在我们就用代码实现快排实现:

#include <iostream>
using namespace std;
const int N = 100010;
int n;
int q[N];

void quick_sort(int q[], int l, int r)
{
    if(l>=r) return;//表示如果只有一个数或者0个数,就不用进行排序了
    //确定分界点
    int x = q[l+r>>1], i = l-1, j = r+1;
    //调整区间
    while(i<j)
    {
        do i++;while(q<x);
        do j--;while(q[j]>x);
        if(i<j)
        {
           swap(q,q[j]);
        }
    }
    //进行递归
    quick_sort(q,l,j);//先对左半边递归排序
    quick_sort(q,j+1,r);//再对右半边递归排序
   
}
int main()
{
    scanf("%d",&n);
    for(int i =0; i<n;i++)
    {
        scanf("%d",&q);
    }
    quick_sort(q, 0 , n-1);
    for(int i =0;i<n;i++)
    {
        printf("%d ",q);
    }
}

结果:

微信图片_20201020152601.png

收藏 评论0 发布时间:2020-10-20 15:25

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版