美文网首页周文佳语强化班
荷兰国旗问题与快速排序

荷兰国旗问题与快速排序

作者: 林博伦 | 来源:发表于2019-11-23 16:43 被阅读0次

荷兰国旗问题

即以最后一个元素进行划分,将一组数据分成三个区域,分别是小于区、等于区、大于区
时间复杂度为:O(N)

  • less 用来记录小于最后一个元素的右下标,初始值为L-1,代表目前在划分区域内没有。
  • more 用来记录大于最后一个元素的左下标,初始值为R,认为最后一个在大于区内。(最后再将最后一个元素与最大区的做元素与其交换)
    • if arr[L] > arr[R] ,交换arr[++less] 和 arr[L++] 的值
    • if arr[L] < arr[R] ,交换 arr[--more] 和 arr[L] 的值
    • if arr[L] < arr[R] ,不交换,L++,直接遍历下一个值
    • 当 L >= more 时,退出循环。

Java代码实现

    public static void partition(int[] arr,int L,int R) {
        int less = L-1;
        int more = R;
        while(L < more) {
            if(arr[L] < arr[R]) {
                swap(arr, ++less, L++);
            }else if(arr[L] > arr[R]) {
                swap(arr,--more,L);
            }else {
                L++;
            }
        }
        swap(arr,more,R);
    }
    
    public static void swap(int[] arr,int i, int j)
    {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

快速排序

快速排序即是荷兰国旗的一个延申,进行递归调用

  • 即是将划分的小于区与大于区分别再进行划分
  • 分别记录下来最小区的最右元素与最大区的最左元素
  • 将记录下的元素分别作为两个荷兰国旗的 R 和 L
  • 每个子划分直到只剩一个元素时停止划分(L < R)

Java代码实现

    public static void quickSort(int[] arr, int L, int R) {
        if(L < R) {
            swap(arr, L + (int) (Math.random() * (R - L + 1)), R);
            int[] p = partition(arr, L, R);
            quickSort(arr, L, p[0]-1);
            quickSort(arr, p[1] + 1, R);
        }
    }
    
    public static int[] partition(int[] arr,int L,int R) {
        int less = L-1;
        int more = R;
        while(L < more) {
            if(arr[L] < arr[R]) {
                swap(arr, ++less, L++);
            }else if(arr[L] > arr[R]) {
                swap(arr,--more,L);
            }else {
                L++;
            }
        }
        swap(arr,more,R);
        return new int[]{less+1, more};
    }
    
    public static void swap(int[] arr,int i, int j)
    {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

相关文章

  • 荷兰国旗问题与快速排序

    荷兰国旗问题 即以最后一个元素进行划分,将一组数据分成三个区域,分别是小于区、等于区、大于区时间复杂度为:O(N)...

  • 【算法】快速排序及优化

    一、荷兰国旗问题 在讲快速排序前,我们先来看看荷兰国旗问题。题目如下: 其实,这就是快排的partition过程,...

  • algorithm md

    算法思想贪心思想双指针排序快速选择堆排序桶排序荷兰国旗问题二分查找搜索BFSDFSBacktracking分治动态...

  • 快排

    荷兰国旗排序图示 荷兰国旗排序code [图片上传失败...(image-cf73bb-1563555823413)]

  • [图解] 快速排序

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

  • 荷兰国旗问题(颜色排序问题)

    版权声明:本文为博主原创文章,转载请注明出处。个人博客地址:https://yangyuanlin.club欢迎来...

  • 数组排序问题(二)

    目录 荷兰国旗问题 随机快排 堆排序 排序算法的稳定性及其汇总 工程中的综合排序算法 比较器的使用 桶排序、计数排...

  • sort-colors

    荷兰国旗问题

  • 荷兰国旗问题

    给定一个数组,元素只有三种取值:0, 1, 2。分别代表三种颜色红白蓝。设计函数调整数组,使得数组按照0,1,2 ...

  • 荷兰国旗问题

    荷兰国旗问题:给定一个数num,将数组中划分成3部分,小于num的部分,等于num的部分,大于num的部分 例题:...

网友评论

    本文标题:荷兰国旗问题与快速排序

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