1.快速排序的定义

快速排序是一种效率很高的排序算法,基本思想是选定一个基准值,然后遍历数组,将小于基准值的元素放在数组左边,大于基准值的元素放在数组右边。然后对数组左边和数组右边的元素重复该步骤。如下是个简单的示例:
原数组:[3,2,5,4,1] 选择pivot为3,pivotIndex = 0
第一次将大于和小于3的元素放在左右后数组变成[2,1,3,4,5].即左边为小于3的元素,右边为大于3的元素。
然后对左边数组和右边数组分别执行如上步骤,即数组[2,1]和数组[4,5]。
同样选择数组第一个元素2和4作为pivot。
经过上述步骤后数组变成[1,2]和[4,5]。最后整个数组变成[1,2,3,4,5]

2. 时间复杂度

平均时间复杂度:\( O(nlogn) \)
最坏时间复杂度:\( O(n^2) \)
如数组[1,2,3,4,5]。我们每次选择第一个元素作为pivot,那么整个排序步骤大概是如下过程
[1,2,3,4,5]
[],[2,3,4,5]
[],[3,4,5]
[],[4,5]
[],[5]

即每次左边的元素都是空的。这样5个元素每次就要递归对子数组排序5次。而每次要遍历整个数组。所以时间复杂度为 \( O(n^2) \)

3. Java实现

public void quickSort(int[] arr) {
    quickSortInternal(arr, 0, arr.length - 1);
}

private void quickSortInternal(int[] arr, int low, int high) {
    int left = low, right = high;
    while (left < right) {
        while (arr[left] < arr[low]) {
            left++;
        }
        while (arr[right] > arr[low]) {
            right--;
        }
        swap(arr, left, right);
    }
    // then the low element is lower than the element in pivotIdx
    // the high element is higher than the element in pivotIdx
    // repeat the above steps in left arr and right arr if low < high
    if (low < high) {
        quickSortInternal(arr, low, low - 1);
        quickSortInternal(arr, low + 1, high);
    }
}

private void swap(int[] arr, int i, int j) {
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}

4. 数据结构系列代码地址

Github:https://github.com/bennetty74...


benntty74
49 声望0 粉丝

小透明


引用和评论

0 条评论