首页 > 代码库 > 快速排序

快速排序

一直以来,对排序都不太感冒,能立马写出来的排序恐怕就只有冒泡排序了,但是我又深知排序算法还是挺重要的

然后,就不得不研究一下,那首先拿快速排序来开刀吧

我们先不管排序的复杂度什么的,直入主题

题目:对数列 4 6 9 3 2 8 5 1 用快速排序

首先抽出一个数字(可以是这个数列中的任何一个)

抽取第一个吧 x=4

然后对数列进行标记

A1 = 4, A2=6 …… A8=1

首先从后往前找(肯定是找比x小的了,大的就放在后面吧,反正我们是从小到大,从左往右排的),一下子就找到了 A8就比X小

然后怎么办呢?

A8的数字挖出来,放在x原来在的位置,那就是第一个喽

1 6 9 3 2 8 5 _  

后面找过了,开始找前面(前面要找比x大的),找到了A2

然后把它挖出来,放哪里呢?当然是当到坑里了,坑在哪?刚刚最后一个位置不是刚刚挖出一个数字嘛,于是那个位置就变成坑了(是不是挺合理的?嘿嘿)

1 _ 9 3 2 8 5 6

继续继续 

又该从后面找了,要从A8 开始,找啊找 找到了 A5 

于是数列变成了

1 2 9 3 _ 8 5 6

又要从前面找了,其实我觉得挺公平的,前后一替一次,防止吵架,这次是A3

1 2 _ 3 9 8 5 6

后面 A4 

1 2 3 _ 9 8 5 6

这个时候好像坑前面的都比x小,后面的都比x大,可是我们能看见,计算机不知道啊,怎么办呢?

那就再找一次,该前面了,上次找到了A3,继续找,A3后面就是A4,可是A4刚刚都被找过了,再来一次明显不合理嘛,一个人被抢一次就行了,再抢一次那就太对不起观众了,所以到此为止,不找了,那总得有个理由吧,什么理由呢? 就说 A3++ = A4(位置,不是数字哦)或在 A4-- =A3

这找了一遍,好像还不是从小到大的排序啊,再来

这次咱们分开,坑前面的一伙,坑后面的一伙,中间的坑要填上 (用x填)

坑前的 1 2 3

{

这好像是排好序的了,可是计算机依然不知道啊(有的时候,计算就爱认死理,非要证据,那好,咱们给他证据)

继续挖坑算法(快速排序哪里去了?)

x=1

_ 2 3

从后面开始找,我去啊,都比X大,怎么办,淡然是结束挖坑啊

再然后呢?分坑,坑前(坑前没有,那就算了),坑后的是 2 3 (记得x填坑)

继续

x =2

后面就一个3,没有比x小的,结束挖坑

坑前没有,坑后就一个3,一个数字还比较个毛啊,结束结束,回家吃饭

于是坑前的就变成了 1 2 3 (毛啊,这不是没变嘛,这不一样,这个是计算机认证过的,能和没验的一样?没验的属于没贴牌的东西,错了售后肯定不管的)

}

坑前的没了,还有坑后的呢

{

9 8 5 6

继续挖坑算法

x= 9

_ 8 5 6

6 8 5 _

从前面找没找到,结束挖坑。分坑,填坑!

坑前 6 8 5 坑后 没有

继续挖坑算法

x=6

_ 8 5 

5 8 _

5 _ 8 

这个时候从前面找的和从后面找的碰头了,结束挖坑,分坑,填坑!

前坑和后坑都是一个数字,不用再挖坑了,就这样,后坑也弄完了

}

把前坑和后坑结合起来,于是

1 2 3 4 5 6 8 9

快速排序完成

总结一下

4 6 9 3 2 8 5 1

4  /  _ 6 9 3 2 8 5 1

4  /  1 6 9 3 2 8 5 _

4  /  1 _ 9 3 2 8 5 6

4  /  1 2 9 3 _ 8 5 6

4  /  1 2 _ 3 9 8 5 6

4  /  1 2 3 _ 9 8 5 6

4  /  ( 1 / _ 2 3 ) _ ( 9 / _ 8 5 6 )

4  /  ( 1 / _ ( 2 / _ 3 ) ) _ ( 9 / 6 8 5 _ )

4  /  ( 1 / _ ( 2 / _ ( 3 ) ) _ ( 9 / ( 6 / _ 8 5 ) _ )

4  /  ( 1 / _ ( 2 / _ ( 3 ) ) _ ( 9 / ( 6 /  5 8 _ ) _ )

4  /  ( 1 / _ ( 2 / _ ( 3 ) ) _ ( 9 / ( 6 /  5 _ 8 ) _ )

4  /  ( 1 / _ ( 2 / _ ( 3 ) ) _ ( 9 / ( 6 /  ( 5 ) _ ( 8 ) ) _ )

填坑 1 2 3 4 5 6 8 9