日常算法——快速排序

本贴最后更新于 2555 天前,其中的信息可能已经物是人非

快速排序

快速排序采用的思想是分治思想。
快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他 n-1 个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。
如图:

1a7b0997ba084136866c2bc172e48dfe-quickSort.png

代码实现

package Suanfa;

/**
 * Created by hushangjie on 2017/11/6. 
 */
 public class QuickSort {
    public static void sort(int[] arr, int _left, int _right) {
        int left = _left;
        int right = _right;
        int temp = 0;
        if (left <= right) {
            temp = arr[left];
            while (left != right) {
                while (left < right && arr[right] >= temp) {
                    right--;
                }
                arr[left] = arr[right];
                while (left < right && arr[left] <= temp) {
                    left++;
                }
                arr[right] = arr[left];
            }
            arr[left] = temp;
            sort(arr, 0, left - 1);
            sort(arr, left + 1, _right);
        }
    }

    public static void main(String[] args) {
        int[] a = {32, 2, 33, 22, 434};
        sort(a, 0, a.length - 1);
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    }
}

特点

  1. 当分区选取的基准元素为待排序元素中的最大或最小值时,为最坏的情况,时间复杂度和直接插入排序的一样,移动次数达到最大值 Cmax = 1+2+...+(n-1) = n*(n-1)/2 = O(n^2) 此时最好时间复杂为 O(n^2)

  2. 当分区选取的基准元素为待排序元素中的"中值",为最好的情况,时间复杂度为 O(nlog2n)。

  3. 快速排序的空间复杂度为 O(log2n).

  4. 当待排序元素类似[6,1,3,7,3]且基准元素为 6 时,经过分区,形成[1,3,3,6,7],两个 3 的相对位置发生了改变,所是快速排序是一种不稳定排序

  • 排序
    19 引用 • 16 回帖 • 1 关注
  • 算法
    428 引用 • 254 回帖 • 24 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...