1 基本思想
1.1 意义
快速排序是冒泡排序的改进版,也是最好的一种内排序,还涉及到分治和递归
1.2 简单解释
冒泡排序中记录的比较和交换是在相邻的单元中进行,每次交换只能上移或下移一个单元,因而总的比较和移动次数较多
1.3 基本思想
①先从数列中取出一个数作为基准数(简单起见可以取第一个数)
②分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边(分区)
③再对左右区间重复第一步、第二步,直到各个区间只有一个数(递归)
1.4 图示
第一趟排序
初始状态:10个数
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||
---|---|---|---|---|---|---|---|---|---|---|---|
72 | 6 | 57 | 88 | 60 | 42 | 83 | 73 | 48 | 85 |
指定起始坐标i=0,结束坐标j=9;假设第一个数72为基准数,将72挖出来,空出位置
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||
---|---|---|---|---|---|---|---|---|---|---|---|
6 | 57 | 88 | 60 | 42 | 83 | 73 | 48 | 85 | 72 | ||
i=0 | j=9 | x |
从右向左移动j,找到第一个小于72的值48(j=8)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||
---|---|---|---|---|---|---|---|---|---|---|---|
6 | 57 | 88 | 60 | 42 | 83 | 73 | 48 | 85 | 72 | ||
i=0 | j=8 | x |
将48加入到i=0的(坑)位置,i++变为1,j=8处变为“坑”
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||
---|---|---|---|---|---|---|---|---|---|---|---|
48 | 6 | 57 | 88 | 60 | 42 | 83 | 73 | 85 | 72 | ||
i=1 | j=8 | x |
从左向右移动i,找到第一个大于等于72的值88(i=3)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||
---|---|---|---|---|---|---|---|---|---|---|---|
48 | 6 | 57 | 88 | 60 | 42 | 83 | 73 | 85 | 72 | ||
i=3 | j=8 | x |
将88加入到j=8的(坑)位置,j–变为7,i=3处变为“坑”
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||
---|---|---|---|---|---|---|---|---|---|---|---|
48 | 6 | 57 | 60 | 42 | 83 | 73 | 88 | 85 | 72 | ||
i=3 | j=7 | x |
从右向左移动j,找到第一个小于72的值42(j=5)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||
---|---|---|---|---|---|---|---|---|---|---|---|
48 | 6 | 57 | 60 | 42 | 83 | 73 | 88 | 85 | 72 | ||
i=3 | j=5 | x |
将42加入到i=3的(坑)位置,i++变为4,j=5处变为“坑”
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||
---|---|---|---|---|---|---|---|---|---|---|---|
48 | 6 | 57 | 42 | 60 | 83 | 73 | 88 | 85 | 72 | ||
i=4 | j=5 | x |
从左向右移动i,寻找第一个大于等于72的值,找到坑(此时i=j)也没有找到,循环结束。
此时说明变量i左边的数字全部小于72,右边的数字全部大于72
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||
---|---|---|---|---|---|---|---|---|---|---|---|
48 | 6 | 57 | 42 | 60 | 83 | 73 | 88 | 85 | 72 | ||
i=j=5 | x |
将基准值72填入i=j的坑内,第一趟排序结束
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||
---|---|---|---|---|---|---|---|---|---|---|---|
48 | 6 | 57 | 42 | 60 | 72 | 83 | 73 | 88 | 85 | ||
i=j=5 |
对前后两个分区继续重复刚才的步骤(递归),完成整个数列的排序
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||
---|---|---|---|---|---|---|---|---|---|---|---|
6 | 42 | 48 | 57 | 60 | 72 | 73 | 83 | 85 | 88 |