【练习】分治--快排思想

2024-06-13 1097阅读

【练习】分治--快排思想

  • 🎥 个人主页:Dikz12
  • 🔥个人专栏:算法(Java)
  • 📕格言:吾愚多不敏,而愿加学
  • 欢迎大家👍点赞✍评论⭐收藏

    目录

    颜色分类

    题目描述 

    题解  

    代码实现

    排序数组

    题目描述 

     题解

    代码实现 

    数组中的第k个最大元素

    题目描述 

     题解

    ​编辑 代码实现

    库存管理III( 最小k个数)

    题目描述 

    ​编辑 题解

    代码实现 


                                                       分治:分而治之. 

    颜色分类

    题目描述 

    【练习】分治--快排思想

    题解  

     解法:三指针(数组分三块).

    【练习】分治--快排思想 【练习】分治--快排思想

    【练习】分治--快排思想

    代码实现

        public void sortColors(int[] nums) {
            int i = 0, left = -1, right = nums.length;
            while(i  
    

    排序数组

    题目描述 

    【练习】分治--快排思想

     题解

     解法:快速排序(数组分三块+随机选择基准).

    快排最核⼼的⼀步就是 Partition (分割数 据):将数据按照⼀个标准,分成左右两部分。 这里 不是使用的是将数组分成两部分(挖坑法、Hoare法)。

    【练习】分治--快排思想

    而是使⽤荷兰国旗问题的思想,将数组划分为 左 中 右 三部分:左边是⽐基准元素⼩的数据, 中间是与基准元素相同的数据,右边是⽐基准元素⼤的数据。然后再去递归的排序左边部分和右边 部分即可(可以舍去⼤量的中间部分)。 在处理数据量有很多重复的情况下,效率会⼤⼤提升!!!

    数组分三块,过程就跟上题一样就不在进行详述.

    优化方式有:随机选择基准 和 三位取中.

    【练习】分治--快排思想 

    代码实现 

        public int[] sortArray(int[] nums) {
            qsort(nums,0,nums.length - 1);
            return nums;
        }
        public void qsort(int[] nums,int l , int r) {
            //递归结束
            if (l >= r) {
                return;
            }
            //数组分三块
            int key = nums[new Random().nextInt(r - l + 1) + l];
            int left = l - 1, i = l, right = r + 1;
            while(i  
    

     挖坑法、Hoare法+优化:【练习】分治--快排思想

     数组分三块+优化

    【练习】分治--快排思想

    数组中的第k个最大元素

    题目描述 

    【练习】分治--快排思想 

     题解

    解法:快速选择算法(数组分三块+随机选取基准元素) 。

    在快排中,当我们把数组「分成三块」之后: [l, left] [left + 1, right - 1] [right, r] ,我们可以通过计算每⼀个区间内元素的「个数」,进⽽推断出我们要找的元素是 在「哪⼀个区间」⾥⾯。 那么我们可以直接去「相应的区间」去寻找最终结果就好了。

    【练习】分治--快排思想 代码实现

        public int findKthLargest(int[] nums, int k) {
            return qsort(nums,0,nums.length-1,k);
        }
        public int qsort(int[] nums,int l ,int r, int k) {
            //结束条件
            if (l >= r) {
                return nums[l];
            }
            //1.随机选取基准
            int key = nums[new Random().nextInt(r - l + 1) + l];
            //2.数组分"三块"
            int i = l , left = l - 1, right = r + 1;
            while(i = k) {
                return qsort(nums,right,r,k);
            } else if (b + c >= k) {
                return key;
            } else {
                return qsort(nums,l,left,k - c - b);
            }
        }
        public void swap(int[] nums, int i , int j) {
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }

    库存管理III( 最小k个数)

    题目描述 

    【练习】分治--快排思想 题解

    解法一:堆排.(大根堆)O(NlogN).

    解法二:快速选择算法(数组分三块+随机选取基准元素) O(N) 

    在快排中,当我们把数组「分成三块」之后: [l, left] [left + 1, right - 1] [right, r] ,我们可以通过计算每⼀个区间内元素的「个数」,进⽽推断出最⼩的 k 个数在哪 些区间⾥⾯。 那么我们可以直接去「相应的区间」继续划分数组即可。

     【练习】分治--快排思想

    代码实现 

        public int[] inventoryManagement(int[] nums, int cnt) {
            qsort(nums,0,nums.length-1,cnt);
            int[] ret = new int[cnt];
            for(int i = 0; i = r) {
                return;
            }
            //1.随机选取基准
            int key = nums[new Random().nextInt(r - l + 1) + l];
            //2.数组分三块
            int i = l, left = l - 1,right = r + 1;
            while(i = k) {
                qsort(nums,l,left,k);
            } else if(a + b >= k) {
                return;
            } else {
                qsort(nums,right,r,k - a - b);
            }
        }
        public void swap(int[] nums, int i , int j) {
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }

     

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]