分析:快速排序的原理就是递归+分治法,分治法是讲每次选择基准,讲所有元素按基准左右按大小站队,它是不稳定的,因为这是partition过程导致的,假设元素a和基准a重复,但是不能保判断条件<=a时候从后面的元素移动到基准左边。举例如下:
3 1 2 8 3
从右向左找<= 3的数,就是尾数3,它必然会移动到基准3之前,而且最后基准3是要和while条件推出的i下标元素互换,所以一定是相同元素位置变动了。
代码:
package com.study.util;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] a = {1, 2, 5, 3, 9, 2};
quickSort(a, 0, a.length - 1);
System.out.println(Arrays.toString(a));
}
private static void quickSort(int[] a, int low, int high) {
if(low > high) return;
int i = low;
int j = high;
int key = a[low];
while (i < j) {
while (i < j && a[j] > key) j--;
while (i < j && a[i] <= key) i++;
if (i < j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
int temp = a[i];
a[i] = a[low];
a[low] = temp;
quickSort(a, low, i - 1);
quickSort(a, i + 1, high);
}
}
注意事项:其实还是递归的基础,记得当时数据结构课上,老师只会讲怎么划分,对递归只字不提,如果数据结构和算法思想不结合起来,有什么意义呢,另外一点是关于变量为什么要保存:
int i = low;
int j = high;
一个是在基准与i下标元素交换时候得是最开始递归那一层的基准,所以需要记忆,另外一作用是:
quickSort(a, low, i - 1);
quickSort(a, i + 1, high);
分治法的参数要和原问题的参数对应。