快速排序理解:
将序列中一个值作为基准值, 从最后一位开始向前和基准值比较出现小于的值与基准值交换位置,之后从前开始往后找大于基准值的数,找到停止并与基准值交换,重复流程直到左右比较的值“遇到”。遇到后出现基准值左边的数都小于基准值,右边的都大于基准值。通过基准值将其分割两个部分继续重复递归比较以上步骤。
通过两个不相邻元素交换,可以一次交换消除多个逆序,加快排序速度。快速排序方法在要排序的数据已经有序的情况下最不利于发挥其长处。
代码演示:
package com.example.demo;
public class Test {
public static void main(String[] agre) {
int[] nums1 = { 3, 6, 1, 3, 7, 9, 2, 8 };
sort(nums1, 0, 7);
}
public static void sort(int arr[], int left, int right) {
int low = left;
int high = right;
System.out.println("开始数据:");
System.out.print("low=" + (left) + " high=" + (right) + " povit=" + arr[low] + "\n");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
System.out.print(arr[i]);
} else {
System.out.print(arr[i] + ",");
}
}
System.out.println();
int povit = arr[low];
while (low < high) {
while (low < high && arr[high] >= povit)
high--;
if (low < high) {
int temp = arr[high];
arr[high] = arr[low];
arr[low] = temp;
low++;
}
while (low < high && arr[low] <= povit)
low++;
if (low < high) {
int temp = arr[high];
arr[high] = arr[low];
arr[low] = temp;
high--;
}
}
System.out.println("结束数据");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
System.out.print(arr[i]);
} else {
System.out.print(arr[i] + ",");
}
}
System.out.println();
System.out.println();
if (low - 1 > left)
sort(arr, left, low - 1);
if (high + 1 < right)
sort(arr, high + 1, right);
}
}
输出过程:
开始数据:
low=0 high=7 povit=3
3,6,1,3,7,9,2,8
结束数据
2,1,3,3,7,9,6,8
开始数据:
low=0 high=1 povit=2
2,1,3,3,7,9,6,8
结束数据
1,2,3,3,7,9,6,8
开始数据:
low=3 high=7 povit=3
1,2,3,3,7,9,6,8
结束数据
1,2,3,3,7,9,6,8
开始数据:
low=4 high=7 povit=7
1,2,3,3,7,9,6,8
结束数据
1,2,3,3,6,7,9,8
开始数据:
low=6 high=7 povit=9
1,2,3,3,6,7,9,8
结束数据
1,2,3,3,6,7,8,9