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)
浙公网安备 33010602011771号