目录
一、前言
快速排序--Hore版(基础)点击下面链接:
http://t.csdnimg.cn/a4Rb0http://t.csdnimg.cn/a4Rb0
快速排序--挖坑法(非常好懂版)点击下面链接:
http://t.csdnimg.cn/WSoZzhttp://t.csdnimg.cn/WSoZz
这篇文章将介绍第三种方法,前后指针法
二、基本思想(重点)
1)理解指针作用
无论是什么方法,快排基本的思想就是让选定的数一次排序后到他应到的位置。
正如其名,我们这里需要用到两个指针,看图:
接下来,我们考虑的就是怎么把key放到属于他的位置上
两个指针的作用就来了,那就是可以确定一个区间,区间内的值都有共同特点
那这里我们就让prev和cur确定的这个区间都是比key大的值,并且把这个区间放在最右边
就像这个样子:
2)控制指针
现在对 cur 和 prev 的把控就极其重要
我们直接来看方法:
cur 就像一名清理者,遇到不符合区间的值,就把它扔到后面去,保持区间的“干净”
cur 找小
找到后,prev++
交换 cur 和 prev 位置上的值
没找到,就向后走
直到 cur 走出区间
最后交换 key 和 prev 位置上的值
继续上图解:
三、代码实现
int PartSort3(int* a, int begin, int end)
{
int cur = begin+1;
int prev = begin;
while (cur <= end)
{
if (a[cur] < a[begin])
{
++prev;
Swap(&a[prev], &a[cur]);
}
cur++;
}
Swap(&a[begin], &a[prev]);
return prev;
}
void QuickSort(int* a, int begin ,int end)
{
if (begin >= end)
return;
int keyi= PartSort3(a, begin, end);
// 左 keyi 右
QuickSort(a, begin, keyi - 1);
QuickSort(a, keyi + 1, end );
}
四、结语
到此,快速排序的三种方法就讲解结束了,回头一看,最重要的是理解这个思想的本质。
抓住本质,尽管方法多样,但万变不离其宗。
如果你还没有看过前两种,可以点击最上面的链接,也可以直接点进作者主页。
之后,还会更新快速排序的优化。
画图不易,你的赞和关注也是我前进的动力!
最后,作者主页有许多有趣的知识,欢迎大家关注作者,作者会持续更新有意思的代码,在有趣的玩意儿中成长!