美文网首页Java
[图解] 快速排序

[图解] 快速排序

作者: CoderJed | 来源:发表于2019-01-08 17:09 被阅读0次

1. 经典快速排序图示过程

(1) 经典快速排序的总体流程

(2) 根据基准值分区的过程

[算法题] 荷兰国旗问题中有详细的介绍。

2. 随机快速排序

经典快速排序总是指定数组或者某部分的最后一个元素作为基准值,随机快速排序指定数组或者某一部分中的随机值作为基准值。

3. 动图展示

quickSort.gif

4. 随机快速排序Java代码实现

/**
 * 快速排序,使得整数数组 arr 有序
 */
public static void quickSort(int[] arr) {
    if (arr == null || arr.length < 2) {
        return;
    }
    quickSort(arr, 0, arr.length - 1);
}

/**
 * 快速排序,使得整数数组 arr 的 [L, R] 部分有序
 */
public static void quickSort(int[] arr, int L, int R) {
    if(L < R) {
        // 把数组中随机的一个元素与最后一个元素交换,这样以最后一个元素作为基准值实际上就是以数组中随机的一个元素作为基准值
        swap(arr, new Random().nextInt(R - L + 1) + L, R);
        int[] p = partition(arr, L, R);
        quickSort(arr, L, p[0] - 1);
        quickSort(arr, p[1] + 1, R);
    }
}

/**
 * 分区的过程,整数数组 arr 的[L, R]部分上,使得:
 *   大于 arr[R] 的元素位于[L, R]部分的右边,但这部分数据不一定有序
 *   小于 arr[R] 的元素位于[L, R]部分的左边,但这部分数据不一定有序
 *   等于 arr[R] 的元素位于[L, R]部分的中间
 * 返回等于部分的第一个元素的下标和最后一个下标组成的整数数组
 */
public static int[] partition(int[] arr, int L, int R) {

    int basic = arr[R];
    int less = L - 1;
    int more = R + 1;
    while(L < more) {
        if(arr[L] < basic) {
            swap(arr, ++less, L++);
        } else if (arr[L] > basic) {
            swap(arr, --more, L);
        } else {
            L++;
        }
    }

    return new int[] { less + 1, more - 1 };

}

/*
 * 交换数组 arr 中下标为 i 和下标为 j 位置的元素
 */
public static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

5. 复杂度

  • 时间复杂度:O(nlogn)
  • 空间复杂度:快速排序使用递归,递归使用栈,因此它的空间复杂度为O(logn)
  • 稳定性:快速排序无法保证相等的元素的相对位置不变,因此它是不稳定的排序算法

相关文章

  • iOS实现冒泡排序、快速排序、选择排序、希尔排序、插入排序等算法

    1、冒泡排序 图解: 2、选择排序 图解: 3、快速排序 图解: 4、插入排序 图解: 5、希尔排序 图解: 6、...

  • 快速排序

    最近看了算法图解这本书,讲讲里面的快速排序: 快速排序的精髓在于 基准值和分而治之思想; 快速排序的基本步骤: 选...

  • 算法 - 1

    1. 快速排序1.1 学习分而治之1.2 快速排序的Demo方法1.3 快速排序的图解 2. 二分查找2.1 二分...

  • [图解] 快速排序

    1. 经典快速排序图示过程 (1) 经典快速排序的总体流程 (2) 根据基准值分区的过程 在[算法题] 荷兰国旗问...

  • 图解排序算法:快速排序

    来源于公众号:码农田小齐作者: 小齐本齐 (本文来自作者投稿) 快速排序算法 首先选一个基准 pivot,然后过一...

  • 快排算法----挖坑法

    教科书算法: [图解快速排序] 觉得比较好的算法(有点争议,但是可以参考): [坐在马桶上看算法:快速排序] 本人代码:

  • 代码小工蚁的#《算法图解》#学习笔记-C4快速排序

    代码小工蚁的#《算法图解》#学习笔记-C4快速排序C4 快速排序quicksort 一、递归式问题的解决方法 递归...

  • 《算法图解》NOTE 4 快速排序法

    这是《算法图解》的第四篇读书笔记,主要涉及快速排序法。 1.递归与分治法 快速排序法(quick sort)之所以...

  • 算法图解-快速排序

    1. 分而治之分而治之(divide and conquer,D&C)——一种著名的递归式问题解决方法。快速排就是...

  • 快速排序(1)

    快速排序是经典的排序算法,最理想的情况下,时间复杂度近乎二分法,平均时间复杂度为O(nlogn)关于快速排序的图解...

网友评论

    本文标题:[图解] 快速排序

    本文链接:https://www.haomeiwen.com/subject/fjfbrqtx.html