前面的博文讲了冒泡排序、选择排序、插入排序,今天我们谈谈快速排序!
快速排序的基本思想是:
1.先从序列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。(分区的方式多样,但一定要保证基准数左边的数比它大(小),右边的数比它小(大))
3.再对左右区间重复第一步、第二步,直到各区间只有一个数。
快速排序的关键点(一定要理解):
1、 如何确定基准数?
一般情况下,选取当前数组的第一个数。
2、如何找到比基准数大(小)的数?(假设从小到大排序)
先从后往前找比基准数小的数;再从前往后找比基准数大的数;(注意次序不能颠倒)
3、找到的数如何放,才能实现比基准数大和小的数分别在基准数的两边?
采用挖坑填数法,具体过程如下:
①每次把基准数所在的位置看成一个坑位A,定义两个变量:left和right分别指向数组的左端和右端。
②从后往前扫描数组,当发现有值小于基准值时,将当前值填到坑位A中,同时当前值所在的位置看成新的坑位B;
③从前往后扫描数组,当发现有值大于基准值,将当前值填到坑位B中,同时当前值所在的位置看成坑位A;
不停的重复第②~③步的操作,直到left>=right相遇,表示这一轮的内循环比较结束,
将基准值填到left(right)指向的坑位中,就完成了本轮的排序;
4、以基准值为分割点,将当前的数组为两个小的数组,依次从第1步递归循环操作;
为了便于学者深入理解,举例:[14, 18, 11, 30, 28,4 ]进行从小到大的排序
整个过程中涉及三个参数:当前基准数num,left,right; (left,right分别代表当前数组的左右端位置)
第1轮:基准数num=14
①交换前的数据:[14, 18, 11, 30, 28,4 ] 当前坑位[0],left=0,right=5
②