示意图(封面)
上一期我们讲了冒泡排序,这一期我们讲解一个冒泡排序的升级版,快速排序(以下简称快排),首先,让我们了解下什么是快排。
基本原理:快排是基于一种分治的方法实现(不懂分治的同学查下百度词条)。
我们现在对{31,78,29,10,96,65,12,46}进行排序。首先在这个序列中随便找一个数作为基准数31。接下来,需要将这个序列中所有比基准数大的数放在31的右边,比基准数小的数放在31的左边,一次排序后:
12 10 29 31 96 65 78 46
具体的排序步骤,本来我找了个动图,但是由于审核问题我就不po上来了,大家把程序敲进自己的ide中debug运行下,理解的会更加深刻。
下面我文字描述下。
在开始的时候,31在序列的第1位。我们的目标是将31挪到序列中间的某个位置,从而达到这个位置的左面都小于基准值31,右面都大于基准值31。
现在呢,无论其他数字怎么排列,基准值31的位置最终就是确定的了。
所以序列被分割为两个序列12 10 29 (序列1) 和 96 65 78 46 (序列2)。
两个序列分别进行刚才的选择基准进行排序。
序列1选择12作为基准值,排列后的结果就是10 12 29,由于12左面和右面都只有1个数字,不构成序列,序列1这就完成了排序。
我们再来看序列2,选择96作为基准值,排序结果如下:
65 78 46 96
96的左边又构成了一个新的无序序列 65 78 46 (序列3)。
选择65作为基准值再次进行排序,排序结果如下:
46 65 78
65的左右都只有一个数字组不成序列,整个序列排序结束,结果为:
10 12 29 31 46 65 78 96
代码实现:(由于排版问题,代码使用图片上传,大家点击原图查看)
快速排序代码
本期快速排序的教程呢,到这里就结束了,大家想让我出哪些系列可以评论区留言给小编,我将一一记录。
下面附上上期冒泡排序的链接给没看到的同学做链接:
经典排序算法一 冒泡排序(JAVA实现)