几个排序理解

2023-11-04

快速排序

快速排序是对冒泡排序的一种改进。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分所有的数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

在这里插入图片描述

public static int[] quickSort(int[] arrs, int left, int right){

        int l = left;
        int r = right;

        int middle = arrs[(left + right) / 2];

        // l > r时两者相交
        while (l < r){

            // 找出左边比中间数大的值
            while (arrs[l] < middle){
                l++;
            }

            // 找出左边比中间数小的值
            while (arrs[r] > middle){
                r--;
            }


            //  如果 l>=r说明左边全部是小于pivot的值,右边全部是大于pivot的值
            if (l >= r){
                break;
            }

            // 交换
            int temp = arrs[l];
            arrs[l] = arrs[r];
            arrs[r] = temp;

            /**
             * 作用:
             *  2000,542,3,1,14,214,154,748,616
             *  交换后
             *  14,542,3,1,2000,214,154,748,616 || 此时l = 0, r = 4
             *  下方递归时:
             *  quickSort(arrs, left, r); left = 0, r = 4
             *  14,542,3,1,2000  || 初始l = 0 , right = 4
             *  则会把2000与14再比较一次, r--呢就可以避开这次无意义的比较
             *  简单来说就是一个小优化,加不加影响不大
             */
            if (arrs[l] == middle){
                r--;
            }

            if (arrs[r] == middle){
                l++;
            }

            // 不错开就会无限循环了,arr[l] = 3, arr[r] = 3, l = r两者一直相同
            if (l == r){
                l++;
                r--;
            }

            if (r > left){
                quickSort(arrs, left, r);
            }

            if (l < right){
                quickSort(arrs, l, right);
            }
        }
        return arrs;
    }

基数排序

 public static int[] sort(int[] array){

        int maxNum = array[0];

        for (int i : array){
            if (maxNum < i){
                maxNum = i;
            }
        }

        // 得到最大数是几位数
        int maxSize = Integer.toString(maxNum).length();

			// 0 - 9十个数,所有new int[10]
			// array.length一共有这点数要存
        int[][] bucket = new int[10][array.length];
        // 记录每个桶中实际存放了多少个数据,比如 个位=5 的数存放了 10个,则bucketCount[5] = 10
        int[] bucketCount = new int[10];

        for (int i = 0, n = 1; i < maxSize; i++, n *= 10){

            for (int value : array) {
                int locationNum = value / n % 10;
                // bucketCount[locationNum] 表示放了该数字几个,可以用来作为坐标
                // bucket[locationNum][bucketCount[locationNum]]存放的数是原来的数
                bucket[locationNum][bucketCount[locationNum]] = value;
                bucketCount[locationNum]++;
            }

            int index = 0;
            // 按照桶顺序将值放入
            for (int j = 0; j < bucketCount.length; j++){

                if (bucketCount[j] != 0){
                    for (int k = 0; k < bucketCount[j]; k++) {
                        array[index++] = bucket[j][k];
                    }
                }
                bucketCount[j] = 0;
            }
        }
        return array;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

几个排序理解 的相关文章

随机推荐

  • H5 手机键盘兼容

    文章目录 键盘弹起页面表现 ios表现 安卓表现 监听软键盘弹起和收起 ios监听focus blur事件 安卓还可见监听页面高度 获取软键盘高度 通过window visualViewport异步获取 唤起软键盘始终让焦点元素滚动到可视区
  • SQL执行计划的十大参数

    调用分析指令分析sql再进行对应的调优 explaion select 十个参数 id 编号 select type 查询类型 table 表 type 索引类型 possible keys 预测可能用到的索引 key 实际使用的索引 ke
  • css实现垂直居中6,CSS实现水平、垂直居中的6种方式

    1 块级元素和行内元素 2 水平居中和垂直居中 3行内元素的水平居中 1 table 2 设置line height 3 text align center 4 margin 0 auto 5 绝对定位 6 flex弹性盒模型 7 calc
  • Http协议、get和post请求整理

    1 什么是GET 和 POST GET 和 POST 其实都是 HTTP 的请求方法 除了这 2 个请求方法之外 HTTP 还有 HEAD PUT DELETE TRACE CONNECT OPTIONS 这 6 个请求方法 所以HTTP的
  • VMware16 Pro的安装及VMware配置CentOS7虚拟机(快照使用)

    VMware16 Pro下载安装 1 进入官网下载 VMware官网 2 选择资源栏目 点击产品下载 3 找到VMware Workstation Pro进行下载 搜索框搜索 vmware workstation 16 pro for wi
  • mysql中双引号和单引号有什么区别

    mysql中双引号和单引号有什么区别 前2天看到有人问 mysql中双引号和单引号有什么区别 希望大家可以关注下公众号 支持一下 鞠躬感谢 我就直接po代码和截图了 如下 select from employees where last n
  • vue3 + vite npm 组件库开发(一)

    1 创建项目 创建一个普通的vite vue3 项目即可 我这里创建的是ts的项目 js也可 根据自己的使用习惯 2 配置项目 根目录下创建packages目录作为组件的开发包 目录下index ts 作为整个组件库的出口文件 导出组件 i
  • “目标检测“+“视觉理解“实现对输入图像的理解

    提出了GLIPv2 一种基于VL的理解模型 它服务于localization任务 例如 目标检测 实例分割 和视觉语言 VL 理解任务 例如 VQA 图像字幕 论文地址 https arxiv org pdf 2206 05836 pdf
  • 如何利用ProcessOn 做资产管理流程图

    资产管理 是一家公司最重要的管理活动 好的资产管理可以让资源最优化利用 实现资产价值的最大化 可以帮助组织管理和降低风险 同时当需要决策的时候 对资产数据进行分析和评估 也可以帮助做出更明智的决策 如优化资产配置 更新技术设备等 一 资产流
  • 笔记24-1(C语言进阶 程序环境和预处理)

    目录 注 推荐书籍 程序的翻译环境和执行环境 编译和链接 翻译环境 编译 预处理 编译 汇编 链接 运行环境 执行环境 注 本笔记参考 B站up 鹏哥C语言 推荐书籍 程序员的自我修养 程序的翻译环境和执行环境 在ANSI C的任何一种实现
  • 可以同情弱者,别同情弱势!

    大家好 我是北妈 0 最近北妈在重刷 天道 里面提到了一个强势文化 弱势文化的概念 我觉得对生活和职场 感情都有些指导作用 我看影评和各种文章讨论这个的概念比较多 毕竟大家都喜欢谈格局 强弱 今天讨论下如何成为强者 强者是不是应该鄙视弱者
  • C++类与对象:初始化列表(赋值和初始化的区别)

    标题 使用初始化列表的情况 初始化与赋值的区别 构造函数体内部是赋值 初始化列表 const成员变量初始化 自定义类型成员初始化 成员变量的缺省值 临时变量 总结 使用初始化列表的情况 成员变量是const类型 成员变量是引用类型 成员变量
  • 求出最大连续子序列和 暴力算法、分治法、动态规划、贪心算法实现;Leecode 51.最大子序和

    求出最大连续子序列和 问题描述 给定一个整数数组 a 找到一个具有最大和的连续子数组 子数组最少包含一个元素 返回其最大和 这个问题也可转入Leecode 51 最大子序和 来源 力扣 LeetCode 示例 输入 2 1 3 4 1 2
  • MAC /usr/bin/目录下 Operation not permitted的解决

    mac系统下的Rootless机制 让我们在root权限下也不能随心所欲的读写所有路径了 特殊情况下我们需要关闭Rootless时 可尝试如下操作 1 重启按住 Command R 进入恢复模式 打开Terminal 2 键入命令 csru
  • 【性能测试】Jenkins+Ant+Jmeter自动化框架的搭建思路

    前言 前面讲了Jmeter在性能测试中的应用及扩展 随着测试的深入 我们发现在性能测试中也会遇到不少的重复工作 比如某新兴业务处于上升阶段 需要在每个版本中 对某些新增接口进行性能测试 有时还需要在一天中的不同时段分别进行性能测试 如果一味
  • Gradle Core Plugins (plugin is not in 'org.gradle' namespace)

    记录一个由 gradle 构建项目遇到的问题 起因 项目原先运行正常 不过个人 移除掉默认仓库 gradle 仓库后 重新拉取报错如下 FAILURE Build failed with an exception Where Build f
  • 框架(Framework)中常用设计模式分析

    文章目录 简介 概述 模式分类 创建型模式设计与分析 简单工厂模式 工厂方法模式 Factory Method 抽象工厂 Abstract Factory 结构型模式设计及分析 适配器模式 Adapter 装饰模式 Decorator 代理
  • opencv学习(十五)之图像傅里叶变换dft

    在学习信号与系统或通信原理等课程里面可能对傅里叶变换有了一定的了解 我们知道傅里叶变换是把一个信号从时域变换到其对应的频域进行分析 如果有小伙伴还对傅里叶变换处于很迷糊的状态 请戳这里 非常通俗易懂 而在图像处理中也有傅里叶分析的概念 我这
  • chromecast投屏_谷歌Chromecast与安卓Miracast投屏技术

    Win10的无线连接显示器用的就是Miracast 安卓Miracast投屏技术 Miracast是WiFi联盟推出来的标准 但这个标准似乎并没有对兼容性作详细的要求 于是 很多电视厂商都基于Miracast 魔改出了自家的投屏技术 例如现
  • 几个排序理解

    快速排序 快速排序是对冒泡排序的一种改进 通过一趟排序将要排序的数据分割成独立的两部分 其中一部分的所有数据都比另一部分所有的数据都要小 然后再按此方法对这两部分数据分别进行快速排序 整个排序过程可以递归进行 以此达到整个数据变成有序序列