前言
上次分享的冒泡排序虽然比较简单、容易理解,但每一次冒泡的过程都需要依次比较相邻的元素,然后交换,可见性能还是有很大的优化空间,只要能减少比较次数,性能自然就上去啦;快速排序便是一个很不错的选择~~~
正文
1.1 快速排序算法思想
快速排序Quicksort是对上一次分享的冒泡排序算法的一种改进,主要是减少比较次数,以此来提高排序性能;也属于交换排序的一种。
算法思想
在待排序列表中任取一个元素作为基准值;将剩下的元素和基准值依次比较,小于的放左边,大于的放右边,最后通过一趟排序将待排序列表分为左右两部分,这个过程称为一次“划分”;然后用同样的方法分别在左右两部分中取基准值进行排序,依次递归,直到划分的每部分内只有一个元素或空为止,则排序结束。
1.2 快速排序算法实现与解析
算法实现
划分代码实现,每一次取对应部分的首位元素作为基准值,然后通过依次比较,将对应数据又在细分为左右两部分,如下实现:
使用递归进行划分排序,直到只有一个元素或为空为止:
运行效果
步骤解析(升序):
上图步骤说明:
上图演示是针对数组array进行升序排序,第一次以全部数据为一组,low为0,high为5,选择low位元素2为基准值(即第一个元素),开始进行比较:
第1.1步:由于刚开始选择low位的元素为基准值(可以认为这个位置空了),所以接下来开始从high位开始遍历比较,high位元素3大于2,不用交换位置,high减1,继续比较;
第1.2步:此时low为0,high为4,high位元素9大于2,不用交换位置,high减1,继续比较;
第1.3步:此时low为0,high为3,high位元素1小于2,需要将high位元素1放到基准值的左边,则将元素1放到low指向的位置;
第1.4步:此时low为0,high为3,由于high位已经交换过了(可以认为这个位置空了),所以这次开始到low位进行遍历比较,low位元素是刚交换过来的,所以不用交换位置;low加1继续比较,此时low为1,对应位置的元素5大于基准值2,所以需要将元素5放到基准值的右边,则将元素5放到high指向位置;
第1.5步:此时low为1,high为3,由于low位已经交换过了(可以认为这个位置空