上次在面试了一次后台开发的时候,而后在交流群里和小伙伴们交流了一下,发现数据结构和算法手撕代码是你们的弱点(包括我本身也是,对数据结构和算法也没有去系统的学习过,这方面很是差劲!),为此本身趁这段时间比较充裕一点,反正也没啥事,少刷点视频,就顺便来系统学习基本的数据结构和算法了,多掌握点技能,提升本身的思惟能力,虽然在实际工做当中去写数据结构或者算法的地方几乎不会用到(固然也跟岗位有关,自身的职业岗位深刻有关。。。),仍是很是值得去学习,只有好处,没有坏处!linux
今天给你们分享的是快速排序,最为重要的是学习它的核心思想,其次再是代码实现!ios
1、快速排序:面试
一、核心思想:算法
(1)、肯定分界点,能够在上图中的数轴上随便找一个点来做为分界点,固然咱们常规的肯定分界点方法有:微信
a、直接取左边界,表示为q[l]数据结构
b、取中间值,表示为q[(l+r)/2]数据结构和算法
c、取右边界,表示为q[r]编辑器
d、这种方法就是随便取了;不过上面三种方法是咱们经常使用的方法!学习
(2)、调整区间:网站
如上图因此,咱们把小于等于x的数字放在小于等于x的区间里面去;把大于等于x的数字放在大于等于x的区间里面去
(3)、递归处理左右两端区间
二、具体实现细节分分析:
这里咱们用两个指针分别为指针i、指针j,指向数轴上的两端,以下图所示:
让两个指针都往中间走,这里咱们先分析指针i,当指针i指到了小于x的数字,就把它分好位置,继续往下走,直到遇到不符合这个条件,指针i就中止往下访问了;接着咱们来分析指针j了,方法同样,当指针j指向的数字大于x的时候,把它分好位置,继续往下走,直到遇到不符合这个条件,指针j就中止往下访问了,这时进行两边数据互换swap();接着继续按照这种方式往下访问,直到排序完成为止!
这样说可能还没听明白,那么咱们下面用实际的数字来讲话,好比:三、一、二、三、5
这里咱们取分界点为3;咱们能够看到指针i先指向3,它恰好等于3(不知足小于3的条件,这里的分界点3不要放入到任何的区间去,否则为啥会叫分界点),因此指针i就先暂停;而后是指针j,咱们从图中发现它指向的数字大于3,知足条件,因此先把5放置好位置来,而后继续让指针j往下走:
这个时候你会发现指针j指向的数字是3,不知足条件,因此进行i和j指向的数字进行交换swap(),这里都是3,因此看不出啥变化来。
交换完后,继续按照原来的方式往下走,指针i和指针j指向的数字以下:
这个时候咱们会发现指针i指向的数字是1,因此符合条件,放置好位置来,继续往下走,你会发现指向数字2,知足条件,一样放置好位置来,而后继续往下走,此时指针i指向的数字是3,不知足条件,就中止下来:
这个咱们分析指针j,它此时指向的数字是2,不符合条件,就中止下来,这个时候不能进行交换数据了!
三、代码实现:
如今咱们就用代码实现快排实现:
#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[i]<x);
do j--;while(q[j]>x);
if(i<j)
{
swap(q[i],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[i]);
}
quick_sort(q, 0 , n-1);
for(int i =0;i<n;i++)
{
printf("%d ",q[i]);
}
}
结果:
参考:https://www.acwing.com/activity/content/punch_the_clock/11/,网站:AcWing
我是txp,一个只专一于干货分享的博主,欢迎随时来撩我,咱们下期见!更多精彩内容,能够微信搜索:txp玩linux;qq群:836108981