快速排序是对冒泡排序的一种改进。
简而言之,就是选第一个数为标杆,将数组的数分为两部分。然后对该数据两边的数据进行递归上述操作。直到不能细分为止。
举例:
将下面一系列数,按递增顺序排列。
0 | 1 | 2 | 3 | 4 |
13 | 15 | 17 | 12 | 14 |
i=0 j=4 k=13
i是下标初始值,j是下标最大值,k是i=0下标的值,我们取之为初始值。
第一轮:
第一次:
我们从右往左取,j值递减,直到找到一个比k值小的数,然后将两个值的位置互换,并将j值更新为当前k值所在位置的下标。
0 | 1 | 2 | 3 | 4 |
12 | 15 | 17 | 13 | 14 |
此时 i=0,j=3,k=13
第二次:我们从左到右,i值递增,直到找到一个比k值大的数,然后将两个值的位置互换,并将i值更新为k值当前所在位置的下标。
0 | 1 | 2 | 3 | 4 |
12 | 13 | 17 | 15 | 14 |
此时i=1,j=3,k=13
第三次:重复第一次操作,发现没有数据可以互换,此时i,j,k三值不变。
第四次:重复第二次操作,发现也没有数据可以互换,此时i,j,k三值不变。
此时情况 i和j值并不相等,但是第一轮已经结束了,(如果i值和j值相等说明,该轮已经结束)。
第二轮:则是对k值两边的数进行再次快速排序。以此类推,不可再分为止。
k值左边的由于只有一个数,不可再排序。所以,不进行快速排序了。
我们现在对k值右边的数组进行排序。
0 | 1 | 2 |
17 | 15 | 14 |
i=0;j=2;k=17
参照第一轮第一次操作进行结果如下:
0 | 1 | 2 |
14 | 15 | 17 |
i=0;j=2;k=17
第二次操作参照第一轮第二次操作:
i=0;j=2;k=17
第二轮操作结束,开始对17左边的两个数进行排序;
第三轮:
0 | 1 |
14 | 15 |
第一次:i=0;j=1;k=14,依旧参考第一轮第一次操作,i,j,k三值均不变。
排序结束
Java代码参考链接:https://blog.csdn.net/jianyuerensheng/article/details/51258374