java快速排序
java快速排序是十大排序算法之一,面试经常会问,记录一下学习心得。对以下数组排序
首先我们取 li[0] 的值为基准temp。左边界为0,右边界为li.length -1 = 8
从右开始,和基准值作比较,如果小于等于基准值,则替换掉 li[0]的值,否则右边界-1
0 | -1 | 35 | 44 | -45 | 88 | -99 | 55 | 55 |
两个55都是>0的,右边界-2=6,到了-99的时候小于0了,则替换 li[左边界] = li[右边界]
-99 | -1 | 35 | 44 | -45 | 88 | -99 | 55 | 55 |
再从左开始如果大于基准值,则替换右边界的值,否则左边界+1。这里-99是小于基准的,所以+1=1.
li[1] = -1 < 0 所以左边界再+1. li[2]=35 > 0 则替换右边界的值。
-99 | -1 | 35 | 44 | -45 | 88 | 35 | 55 | 55 |
再从右边开始找
-99 | -1 | -45 | 44 | -45 | 88 | 35 | 55 | 55 |
再从左边找
-99 | -1 | -45 | 44 | 44 | 88 | 35 | 55 | 55 |
再从右边找,发现左边界=右边界时,赋值为temp
-99 | -1 | -45 | 0 | 44 | 88 | 35 | 55 | 55 |
这样我们第一个数的合适位置就找到了。
最后再把数组从0分为两个数组进行处理,
第一个数组左边界为0,右边界为3-1
第二个数组左边界为3+1,右边界为li.length-1
这样进行递归即可。
public static void soutHelp(int[] li) { for (int i = 0; i < li.length; i++) { System.out.print(li[i] + "\t"); } System.out.println(""); } public static void quick(int[] li, int l, int r) { if (l < r) { int temp, i, j; i = l; j = r; temp = li[l]; while (i != j) { // 先从右边找到小于初始值的数 while (i < j && li[j] >= temp) { j--; } li[i] = li[j]; // 再从左边开始找 while (i < j && li[i] <= temp) { i++; } li[j] = li[i]; } li[i] = temp; quick(li, l, i - 1); quick(li, i + 1, r); } } public static void main(String[] args) { int[] li = {0, -1, 35, 44, -45, 88, -99, 55, 55}; quick(li, 0, li.length - 1); soutHelp(li); }
输出结果为: -99 -45 -1 0 35 44 55 55 88
要注意这儿判断的时候需要加上=,不然如果数组中有相同值的时候会进入死循环。
while (i < j && li[j] >= temp)