常用排序算法总结:快速排序

108 阅读1分钟

快速排序的基本思想: 采用经典的分治策略,选择数组中某个元素作为基准数,通过一趟排序将数组分为独立的两个子数组,一个子数组中所有元素值都比基准数小,另一个子数组中所有元素值都比基准数大。然后再按照同样的方式递归的对两个子数组分别进行快速排序,以达到整个数组有序。

代码实现

public static void quickSort(int[] array, int start, int end) {
    // 开始索引比最后的索引大或者相等,就没有必要继续了。
    if (start >= end) {
        return;
    }

    int i = start;
    int j = end;
    // 选定一个基准值,这个值可以是整个数组中任何一个数据。
    int baseNumber = array[i];

    while (i < j) {
        // 从右往左找一个比基准值小的数,准备交换。
        while (i < j && array[j] > baseNumber) {
            j--;
        }
        // 从左往右找一个比基准值大的数,准备交换。
        while (i < j && array[i] < baseNumber) {
            i++;
        }
        // 交换这两个数,然后继续,因为一次遍历可以存在多次交换。
        if (i < j) {
            int temp =array[i];
            array[i] = array[j];
            array[j] = temp;
            i++;
            j--;
        }
    }
    quickSort(array, start, i - 1); /* 递归调用 */
    quickSort(array, i + 1, end); /* 递归调用 */
}

快速排序也是利用了分治的处理方式,就是将复杂的问题分成一个一个的小块进行逐步处理。 快速排序法平均时间复杂度是O(nlgn)。最差是O(n2),这种情况对应的是,选取的基准值在最左边,且,使用了从小到大的排序,这就会将快速排序变成冒泡排序。

O(nlgn)的由来,外层的while (i < j) 是n,内部由于使用了分治,复杂度是O(lgn),所以整体复杂度变成了O(nlgn)