算法思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
public class QuickSort {
public static void main(String[] args) {
int[] arr = { 12, 20, 5, 16, 15, 1, 30, 45, 23, 9 };
System.out.println("原数组为:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
solution(arr, 0, arr.length - 1);
System.out.println();
System.out.println("排序后的数组为:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
private static void solution(int[] arr, int low, int high) {
if (low > high || arr.length == 0) {
return;
}
int start = low;
int end = high;
int key = arr[low];
// 一次循环开始
while (start < end) {
// 从后往前查找元素与key比较
while (start < end && arr[end] >= key) {// 直到找到一个比key小的元素,交换位置
end--;
}
if (arr[end] <= key) {
int temp = key;
arr[start] = arr[end];
arr[end] = temp;
}
// 然后再从前往后查找元素与key比较
while (start < end && arr[start] <= key) {// 直到找到一个比key大的元素,交换位置
start++;
}
if (arr[start] >= key) {
int temp = key;
arr[start] = arr[end];
arr[end] = temp;
}
}
// =======================第一次循环比较结束,关键值的位置已经确定=====================
// 递归对左边的序列排序
if (low < start) {
solution(arr, low, start - 1);
}
// 递归对右边的序列排序
if (end < high) {
solution(arr, end + 1, high);
}
}
}