快速排序

80 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

快速排序
快速排序是对冒泡排序的一种改进算法
基本实现:
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
			注意:若以第一个元素为基准数(就如上面的示例),在哨兵互走过程需右边的哨兵先走。 原因很好理解,看上面过程解析就会明白:哨兵互走交换的过程就是不断排序的过程。若右边的哨兵先走,不管走多少次,最后相遇时的那个数是小于基准数的。这时与基准数交换,正好分为两个序列。可若是左边的先走,相遇在大于基准数上就不好办了。