首页 > 其他分享 >快排拓展

快排拓展

时间:2023-12-19 14:47:14浏览次数:34  
标签:smaller target int ++ 拓展 快排 public bigger

快速排序

三个区域排序

思路来源

一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到

笔记内容

1.0
  • 问题描述

    在一个数组中,使用快排分出大于、等于、小于某一数值的区域

  • 算法思路

    1. 使用两个变量bigger、smaller记录已经排好的大于、小于区域边界。
    2. x[i] < num, swap(x[i],x[smaller+1]),i++,smaller++
    3. x[i] = num, i++
    4. x[i] > num, swap(x[i],x[bigger - 1]),bigger --
  • 代码实现

    public class Quicksort {
        public static void main(String[] args) {
            int[] c = {6,7,8,5,9,6};
            getResult(c,5);
            for (int i = 0; i < c.length; i++) {
                System.out.print(c[i]);
            }
        }
    
        public static void getResult(int[] target, int key){
            int smaller = -1;
            int bigger = target.length;
            int i = 0;
            while (i < bigger){
                if(target[i] < key){
                    int temp = target[smaller+1];
                    target[smaller+1] = target[i];
                    target[i] = temp;
                    i++;
                    smaller++;
                } else if (target[i] == key) {
                    i++;
                }else {
                    int temp = target[bigger-1];
                    target[bigger-1] = target[i];
                    target[i] = temp;
                    bigger--;
                }
            }
        }
    }
    
    
2.0
  • 问题描述

    按照1.0方式,在一个数组中,使用快排排序数组

  • 算法思路

    1. 选定一个数值中的值后进行三个区域的排序,那么等于区域位置可以被直接确定。
    2. 接下来再对大于小于区域做同样操作,直至固定全部数值位置。
  • 代码实现

    import java.util.Arrays;
    import java.util.Random;
    
    public class Quicksort {
        public static void main(String[] args) {
            int[] c = {2,3,9,5,7,6,4,3,5,9,8,2,1};
    getResult(c);
            for (int i = 0; i < c.length; i++) {
                System.out.print(c[i]);
            }
        }
    
        public static void getResult(int[] target){
            if(target.length <= 1 ){
                return;
            }
            Random random = new Random();
            int key = target[random.nextInt(target.length)];
            int smaller = -1;
            int bigger = target.length;
            int i = 0;
            while (i < bigger){
                if(target[i] < key){
                    int temp = target[smaller+1];
                    target[smaller+1] = target[i];
                    target[i] = temp;
                    i++;
                    smaller++;
                } else if (target[i] == key) {
                    i++;
                }else {
                    int temp = target[bigger-1];
                    target[bigger-1] = target[i];
                    target[i] = temp;
                    bigger--;
                }
            }
            int[] left = Arrays.copyOfRange(target,0,smaller+1);
            int[] right = Arrays.copyOfRange(target,bigger,target.length);
            getResult(left);
            System.arraycopy(left, 0, target, 0, left.length);
            getResult(right);
            System.arraycopy(right, 0, target, bigger, right.length);
        }
    }
    
    

标签:smaller,target,int,++,拓展,快排,public,bigger
From: https://www.cnblogs.com/nouleeee/p/17913698.html

相关文章

  • 拓展了个新业务枚举类型,资损了
    分享是最有效的学习方式。案例背景翻车了,为了cover线上一个业务场景,小猫新增了一个新的枚举类型,盲目自信就没有测试发生产了,由于是底层服务,上层调用导致计算逻辑有误,造成资损。老板很生气,后果很严重。产品提出了一个新的业务场景,新增一种套餐费用的计算方式,由于业务比较着急,......
  • EM算法——最大似然估计的拓展
    EM算法(Expectation-Maximization)是一种用于解决含有隐变量的概率模型参数估计问题的迭代优化算法。其基本思想是通过交替进行期望(Expectation)和最大化(Maximization)两个步骤来优化模型参数。在E步骤中,通过当前参数对隐变量的条件分布进行估计,计算完全数据对数似然的期望值。这一步......
  • 想想为什么这两段代码,一段可以实现快排,一段实现不了?
    可实现代码#include<stdio.h>voidquicksort(inta[],inti,intj);intmain(){intnum;inta[10001]={0};scanf("%d\n",&num);inti=0;while(i<num){scanf("%d",&a[i]);i++;......
  • 08_实验七_拓展实验二
    拓展实验2:在物理机上运行EOS操作系统任务一:改进EOS内核引导过程,实现裸机从无文件系统的平坦软盘镜像引导内核代码调整将EOS内核引导过程调整为U盘引导后,就不再需要对内核进行FAT文件系统相关内容的初始化,将其注释掉,否则会因为初始化失败而无法进入到内核。需要将文件......
  • 07_实验七_拓展实验一
    拓展实验1本拓展实验的任务和目标是为了更好的理解和认识EOS操作系统的内核程序。EOS的内核程序的代码在codecode平台已经给出。参考上面之前已经完成的6个基础实验的调试过程可以更好的理解内核程序的代码。然后调试一个应用程序的执行过程,详细了解了EOS操作系统的所有重要模......
  • 09_实验八_拓展实验三
    拓展实验三:线程调度算法改进实验目的实现多级反馈队列调度算法实验步骤实现时间片轮转调度算法。修改时间片的大小TICKS_OF_TIME_SLICE为100,方便观察执行后的效果。在控制台命令“rr”的处理函数中,将Sleep时间更改为200*1000,这样可以有充足的时间查看优先级降......
  • 《力扣面试150题》题单拓展——回溯
    《力扣面试150题》题单拓展——回溯1.基础知识voidfind(string&s,inti,string&path){//终止条件 if(i==s.size()){ans.push_back(path);return;}for(intk=0;k<index[sub].size();k++){//处理一层path.push_bac......
  • 《力扣面试150题》题单拓展——滑动窗口
    《力扣面试150题》题单拓展——滑动窗口1.基础知识先区分好,枚举右端点,还是左端点,窗口内的条件改变后,一般都是while控制另一个窗口的移动,然后收集结算我感觉滑动窗口这里变动最大的,什么时候去滑动左窗口,什么时候去收集答案,都很不一样,得慢慢体会滑动窗口难题是真的难,呜呜呜呜......
  • 《力扣面试150题》题单拓展——双指针
    《力扣面试150题》题单拓展——双指针1.基础知识为什么双指针会正确?不会漏掉搜索空间数组nums递增排序,假设共8个元素假设由于搜索空间i<j的限制,只搜索右上角白色倒三角空间,一开始,我们检查右上方单元格(0,7),即计算A[0]+A[7],与target进行比较。如果不相等的话,则要么大......
  • 《力扣面试150题》题单拓展——二分法
    《力扣面试150题》题单拓展——二分法困难题:找第K大/小1.基础知识首先可以确定答案的上下界单调性分析:如果当前答案为m时,可以满足,一定有一侧是一定满足的,另一侧不一定,需要去探索boolis_ok(){}intl,r;intans;while(l<=r){intm=l+((r-l)>>1);......