本文已参与「新人创作礼」活动,一起开启掘金创作之路。
快速排序
快速排序是对冒泡排序的一种改进算法
基本实现:
1.在数组中选一个基准数(通常为数组第一个)
2.将数组中小于基准数的数据移到基准数左边,大于基准数的移到右边
3.对于基准数左,右两边的数据,不断重复以上两个过程,直到每个子集只有一个元素,即为全部有序
4,1,8,3,7,5
1.选第一个基准数为4
2.以基准元素为中心将数组分成两个子集 3,1,4,8,7,5
3.将两个子集重复以上操作,直到全部有序 1,3 5,7,8
4.得到有序的集合 1,3,4,5,7,8
快排解决方法,假设是正序排序
在数组的头部和尾部分别设置一个哨兵,同时向对方走去。尾部的哨兵如发现有比基准数小的数,停下。头部的哨兵如发现有比基准数大的数,停下。交换两个数。再重新走重复前面的交换过程。直到两个哨兵相遇,交换基准数和尾哨兵。
6,1,2,7,9,3,4,5,10,8
1.6为基数,设i,j为两哨兵,指向首尾两个数,分别为6,8
2.两哨兵分别走向对方,直到遇到交换条件,并做交换
6,1,2,(7),9,3,4,(5),10,8 6,1,2,5,9,3,4,7,10,8
3.此时来观察交换后的队列,除去基准数,是不是哨兵走过的位置都已经部分有序了呢?左边1,2,5都比基准数小,右边7,10,8都比基准数大
1,2,5,9,3,4,7,10,8
4.继续走直到相遇,基准数复位
6,1,2,5,(9),3,(4),7,10,8 6,1,2,5,4,3,9,7,10,8
6,1,2,5,4,3,9,7,10,8 3,1,2,5,4,6,9,7,10,8
5.将两个子集重复以上操作,直到全部有序
1,2,3,4,5,6,7,8,9,10
注意:若以第一个元素为基准数(就如上面的示例),在哨兵互走过程需右边的哨兵先走。 原因很好理解,看上面过程解析就会明白:哨兵互走交换的过程就是不断排序的过程。若右边的哨兵先走,不管走多少次,最后相遇时的那个数是小于基准数的。这时与基准数交换,正好分为两个序列。可若是左边的先走,相遇在大于基准数上就不好办了。