首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >算法奇妙屋(三)-快排分治

算法奇妙屋(三)-快排分治

作者头像
景画
发布2025-12-19 12:40:35
发布2025-12-19 12:40:35
110
举报

力扣75.颜色分类

1. 题目


2. 算法原理

在这里插入图片描述
在这里插入图片描述
3. 代码
代码语言:javascript
复制
    public void sortColors(int[] nums) {
        int len = nums.length;
        int left = -1;
        int right = len;
        int i = 0;
        while (i < right) {
            if (nums[i] == 0) {
                swap(nums,++left,i++);
            }else if (nums[i] == 2) {
                swap(nums,--right,i);
            }else {
                i++;
            }
        }
    }
    public void swap(int[] array, int i, int j) {
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }

力扣912.排序数组(快排-分治)

1. 题目

在这里插入图片描述
在这里插入图片描述

2. 算法原理

在这里插入图片描述
在这里插入图片描述

3. 代码

代码语言:javascript
复制
    public static int[] sortArray(int[] nums) {
        partition(nums,0,nums.length - 1);
        return nums;
    }
    static void partition(int[] nums,int start,int end) {
        if (start >= end) {
            return;
        }
        int len = nums.length;
        int tmp = nums[(new Random().nextInt(end - start + 1)) + start];
        int i = start;
        int left = start - 1;
        int right = end + 1;
        while (i < right) {
            if (nums[i] < tmp) {
                swap(nums,++left,i++);
            }else if (nums[i] > tmp) {
                swap(nums,--right,i);
            }else {
                i++;
            }
        }
        // [s,left], [left+1,right-1],[right,end]
        // 递归左面
        partition(nums,start,left);
        // 递归右面
        partition(nums,right,end);
    }
    static void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }

力扣215. 数组中的第K个最大元素

1. 题目

在这里插入图片描述
在这里插入图片描述

2. 算法原理

在这里插入图片描述
在这里插入图片描述

3. 代码

代码语言:javascript
复制
    public static int findKthLargest(int[] nums, int k) {
        return partition( nums, 0, nums.length - 1,k);
    }

    static int partition(int[] nums, int start, int end,int k) {
        if (start == end) {
            return nums[start];
        }
        int key = nums[(new Random().nextInt(end - start + 1) + start)];
        int left = start - 1;
        int right = end + 1;
        int i = start;
        while (i < right) {
            if (nums[i] < key) {
                swap(nums,++left,i++);
            }else if (nums[i] > key) {
                swap(nums,--right,i);
            }else {
                i++;
            }
        }
        //[s,l] [l+1,r-1] [r,e]
        int b = right - 1 - (left +  1) + 1;
        int c = end - right + 1;
        if (k <= c) {
            return partition(nums,right,end,k);
        }else if (k <= b + c) {
            return key;
        }else {
            return partition(nums,start,left,k - b - c);
        }
    }

    static void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }

力扣面试题 17.14. 最小K个数

1. 题目

在这里插入图片描述
在这里插入图片描述

2. 算法原理

在这里插入图片描述
在这里插入图片描述

3. 代码

代码语言:javascript
复制
    public int[] smallestK(int[] arr, int k) {
        int[] ret = new int[k];
         partition(arr,0,arr.length - 1, k);

        for (int i = 0; i < k; i++) {
            ret[i] = arr[i];
        }
        return ret;
    }
    void partition(int[] arr, int s, int e, int k) {
        if (s >=e) {
            return;
        }
        int left = s - 1;
        int right = e + 1;
        int i = s;
        int key = arr[new Random().nextInt(e - s + 1) + s];
        while (i < right) {
            if (arr[i] < key) {
                swap(arr,++left,i++);
            }else if (arr[i] > key) {
                swap(arr, --right, i);
            }else {
                i++;
            }
        }
        int a = left - s + 1;
        int b = right - 1 - (left + 1) + 1;
        if (k < a) {
             partition(arr,s,left,k);
        }else if (k <= a + b) {
            return;
        }else {
             partition(arr,right,e,k - a - b);
        }
    }
    void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 力扣75.颜色分类
    • 1. 题目
    • 2. 算法原理
      • 3. 代码
  • 力扣912.排序数组(快排-分治)
    • 1. 题目
    • 2. 算法原理
    • 3. 代码
  • 力扣215. 数组中的第K个最大元素
    • 1. 题目
    • 2. 算法原理
    • 3. 代码
  • 力扣面试题 17.14. 最小K个数
    • 1. 题目
    • 2. 算法原理
    • 3. 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档