思想
分而治之
通过不断对数组元素进行切分,逐步将要排序的数组元素数量减少,通过对子数组的排序,实现对整体数据的排序
1) 找出简单的基线条件
2) 确定如何缩小问题规模,使其符合基线条件
实现
public static void quickSort(int[] array, int left, int right) {
if (left -1 >= right) { // 基线条件,要排序的值最多一个,此时有序
return;
}
int base = array[left];
int i = left;
int j = right;
while (i < j) {
while (i < j && array[j] > base) {
j--;
}
while (i < j && array[i] <= base) {
// 将基准值排到左侧
i++;
}
swap(array, i, j);
// 将小于基线条件的值放到左侧,大于基线条件的值放到右侧,找出中介点
}
swap(array, left, j); // i==j,当array[j] 的值小于base 时,需要执行交换
quickSort(array, left, j - 1); // 将数组拆为两部分,缩小问题规模
quickSort(array, j + 1, right);
}
public static void swap(int[] arr, int left, int right) {
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
时间复杂度
每个层级需要检查n个元素,可以切分为log(n)级