排序算法-快速排序

83 阅读1分钟

思想

分而治之
通过不断对数组元素进行切分,逐步将要排序的数组元素数量减少,通过对子数组的排序,实现对整体数据的排序
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;
}

时间复杂度

 nlog(n) \ nlog(n)
每个层级需要检查n个元素,可以切分为log(n)级