十大排序(四)

news2024/11/28 18:50:01

上几篇文章我们说的是比较类的排序,今天给大家分享一下非比较累的排序;非比较类中包含桶排序
:基数排序、桶排序、计数排序
在这里插入图片描述
计数排序
找出待排序的数组中最大和最小的元素;
统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。

	/**
     * @param A
     * @param n
     * @return
     */
    public int[] countingSort(int[] A, int n) {
        if(A==null ||n<2){
            return A;
        }
        //找出桶的范围,即通过要排序的数组的最大最小值来确定桶范围
        int min=A[0];
        int max=A[0];
        for(int i=0;i<n;i++){
            min=Math.min(A[i],min);
            max=Math.max(A[i],max);
        }
        //确定桶数组,桶的下标即为需排序数组的值,桶的值为序排序数同一组值出现的次数
        int[] arr = new int[max-min+1];
        //往桶里分配元素
        for(int i=0;i<n;i++){
            arr[A[i]-min]++;
        }

        //从桶中取出元素
        int index=0;
        for(int i=0;i<arr.length;i++){
            while(arr[i]-->0){
                A[index++]=i+min;
            }
        }

        return A;
    }

桶排序
取得数组中的最大数,并取得位数;
arr为原始数组,从最低位开始取每个位组成radix数组;
对radix进行计数排序(利用计数排序适用于小范围数的特点);

  /**
     * @param A
     * @param n
     * @return
     */

    public int[] radixSort(int[] A, int n) {
        //基于桶排序的基数排序

        //确定排序的趟数,即排序数组中最大值为809时,趟数为3
        int max=A[0];
        for(int i=0;i<n;i++){
            if(A[i]>max){
                max= A[i];
            }
        }
        //算出max的位数
        int time=0;
        while(max>0){
            max/=10;
            time++;
        }
        //【桶】初始化十个链表作为桶,用户分配时暂存
        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
        for(int i=0;i<10;i++){
            ArrayList<Integer> Item = new ArrayList<Integer>();
            list.add(Item);
        }

        //进行time次分配和收集
        for(int i=0;i<time;i++){

            //分配元素,按照次序优先,从个位数开始
            for(int j=0;j<n;j++){
                int index = A[j]%(int)Math.pow(10,i+1)/(int)Math.pow(10,i);
                list.get(index).add(A[j]);
            }
            //收集元素,一个一个桶地收集
            int count=0;
            //10个桶
            for(int k=0;k<10;k++){
                //每个桶收集
                if(list.get(k).size()>0){

                    for(int a: list.get(k)){
                        A[count]=a;
                        count++;
                    }
                    //清除数据,以便下次收集
                    list.get(k).clear();
                }
            }
        }
        return A;
    }

基数排序数据处理
计算原数据集中最大的元素,然后计算有几位
将原数据集遍历,通过个位进行比较,将比较出来的值放入对应编号为0-9的桶中
根据桶的编号将数据拿出排序一个返回集
拿到第三步的返回集,进行遍历,这个适合比较十位的位置,根据十位上的数字比较出来的值存入0-9对应的桶中。
重复第四步,直到最大元素的位数比较完成。

public  int[] radixsort(int[] arr) {
        int max=arr[0];
        for(int i=1;i<arr.length;i++) {
            if(arr[i]>max) {
                max=arr[i];
            }
        }
        int maxLength=(max+"").length();//得到数组最大值的位数,max+""将整型max转为字符串再利用字符串求长度方法length求max的位数
        int[][] bucket=new int[10][arr.length];//此处10表示10个桶分别为0~9
        int[] bucketElemCount=new int [10];//为了记录每个桶中,实际存放了多少个数据,我们定义一个一维数组来记录各个桶的每次放入的数据个数,比如:bucketElemCount[0],记录的就是bucket[0] 桶的放入数据个数
        for(int i=0,n=1;i<maxLength;i++,n*=10){// n=1 表示处理个位,n=10表示处理十位,n=100表示处理百位 ......
            for(int j=0;j<arr.length;j++) {
                int digit=arr[j]/n%10;//取出每个元素的对应位的值
                bucket[digit][bucketElemCount[digit]]=arr[j];//放入到对应的桶中
                bucketElemCount[digit]++;
            }
            int index=0;
            for(int k=0;k<bucketElemCount.length;k++) {//遍历每一桶,并将桶中的数据,放入到原数组
                for(int l=0;l<bucketElemCount[k];l++) {
                    arr[index++]=bucket[k][l];
                }
                bucketElemCount[k]=0;//第i+1轮处理后,需要将每个 bucketElementCounts[k] = 0 即桶中数据置空方便下次使用
            }
        }
        return arr;
    }

第一篇
第二篇
第三篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/590256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Azure Active Directory 的功能和优势

Azure Active Directory (Azure AD) 是 Microsoft 基于云的多租户目录和标识管理服务。 Azure AD 有助于支持用户访问资源和应用程序&#xff0c;例如&#xff1a; 位于企业网络上的内部资源和应用。 Microsoft 365、Azure 门户和 SaaS 应用程序等外部资源。 为组织开发的云应…

详解uni-app应用生命周期函数

详解uni-app应用生命周期函数 详解uni-app应用生命周期函数 文章目录 详解uni-app应用生命周期函数前言一、应用生命周期函数二、页面生命周期函数总结 前言 UNI-APP学习系列之详解uni-app应用生命周期函数 一、应用生命周期函数 函数名说明onLaunch当uni-app 初始化完成时触…

web自动化测试流程的总结及关注点

目录 一、立项后测试需要拿到的文档 二、需求评审 三、用例编写&#xff08;同时根据开发计划编写测试计划&#xff09; 四、用例评审 五、测试执行 六、测试报告及操作手册 项目的测试流程大只包含的几个阶段&#xff1a;立项、需求评审、用例评审、测试执行、测试报告文…

【PXIE301-204】基于PXIE 总线的4 路Cameralink Base 图像采集卡

产品概述&#xff1a; PXIE301‐204 一款基于3U PXI Express 总线的高性能4 路CameraLink Base 图像采集卡&#xff0c;该板卡采用Xilinx 的高性能Kintex‐7 系列FPGA 作为主控制器&#xff0c;实现PCI Express 总线接口的转换&#xff0c;图像数据的缓存&#xff0c;以及Camer…

MySQL表数据的CRUD操作

文章目录 一、CRUD二、Create1.插入基本语法2.单行数据全列插入3.多行数据指定列插入4.插入时如果冲突则更新旧值5.插入时如果冲突则替换 三、Retrieve1.查找基本语法2.全列查询2.指定列查询3.查询字段为表达式4.为查询结果指定别名5.查询结果去重6.where条件7.结果排序8.将查找…

石头剪刀步微信小程序游戏

石头剪刀步微信小程序游戏 一、概述二、选题内容三、效果四、前端源码五、后端源码 一、概述 之前接了学弟的一个课程作业&#xff0c;但是因为某些原因&#xff0c;最终换成了一个新的爬虫项目。 这个作业就是一个石头剪刀步的微信小游戏。就是与系统随机的单机PK&#xff0…

【手撕Spring源码】容器与Bean

文章目录 容器接口容器实现BeanFactory容器实现ApplicationContext容器实现 Bean的生命周期模板方法设计模式Bean后处理器BeanFactory 后处理器有关后处理器(PostProcessor)的调用时期Aware 接口 和 InitializingBean 接口初始化和销毁Scope 容器接口 此节我们要&#xff1a; 了…

人机交互学习-1 人机交互概述

人机交互概述 背景知识人机交互研究的内容人机交互的重要性用户体验用户体验的特性最佳用户体验 人机交互的发展历史人机交互与软件工程人机交互与软件工程的学科差异人机交互与软件工程的不同观点软件工程在交互式系统的缺陷人机交互对软件工程的处理人机交互与软件工程的融合…

2023年春秋杯网络安全联赛春季赛Reverse题目复现

文章目录 一.sum1. 分析程序逻辑2.解数独矩阵3.解题脚本 二.Poisoned_tea_CHELL1. 重新识别函数及程序逻辑分析2.IDA动态调试(attach附加调试)3. 输入选项进行单步调试4.解题脚本 一.sum 1. 分析程序逻辑 这里直接贴上当时分析的结果,根据程序行为不难猜出是数独问题(还得靠猜…

六轴机械臂正逆解计算

一、机械臂运动学 机械臂运动学就是根据未端执行器与所选参考坐标系之间的几何关系&#xff0c;确定末端执行器的空间位置和姿态与各关节变量之间的数学关系。包括正运动学 (Forward Kinematics)和逆运动学 (InverseKinematics)两部分。 正运动学就是根据给定的机器人的各个关…

关于Vuex中使用mapGetters的应用以及项目实例演示以及gettes从接口获取内容更新

哈喽&#xff0c;小伙伴们大家好啊 今天在项目中看到了Vuex&#xff0c;以及看到了mapGettes的使用 1.首先第一步 在src->store->index.js文件中 import Vue from vue import Vuex from vuex import getters from ./gettersVue.use(Vuex) 2.然后第二步骤 在getters文…

[java]关于会话Session

前言: 客户端向服务端发请求&#xff0c;登陆完之后&#xff0c;进入到首页&#xff0c;如何让客户端知道它有没有登陆过呢&#xff0c;需要从首页里面向服务器发出异步请求&#xff0c;请求当前登录的用户信息&#xff0c;登录过就能获取得到&#xff0c;没登陆过获取不到。 …

Socket安全(二)

文章目录 1. 客户端模式2. 创建安全服务器Socket3. 配置SSLServerSocket 1. 客户端模式 大多数安全通信中&#xff0c;服务器需要使用适当的证书认证自己。不过客户端不需要&#xff08;淘宝需要向用户证明它确实是淘宝&#xff0c;但我不需要向淘宝证明我自己的身份&#xff…

Skywalking9.4.0部署监控项目

1、SkyWalking简介 SkyWalking是国内开源的基于字节码注入的调用链分析以及应用监控分析工具。特点是支持多种插件&#xff0c;UI功能较强&#xff0c;接入端无代码侵入。目前使用厂商最多&#xff0c;版本更新较快&#xff0c;已成为 Apache 基金会顶级项目。 它有哪些功能呢…

WebGPU你让我等的好辛苦啊

什么是WebGPU WebGPU是一种新兴的Web标准&#xff0c;旨在为Web应用程序提供高性能的图形和计算功能。它是一种低级别的图形API&#xff0c;为开发人员提供了对现代GPU的直接访问&#xff0c;以实现更高效的图形渲染和通用计算。 WebGPU的设计目标是提供与现代图形API&#x…

文心一言 VS 讯飞星火 VS chatgpt (26)-- 算法导论5.1 1题

一、证明:假设在过程 HIRE-ASSISTANT 的第 4 行中&#xff0c;我们总能决定哪一个应聘者最佳。则意味着我们知道应聘者排名的全部次序。 文心一言&#xff1a; 证明: 假设在过程 HIRE-ASSISTANT 的第 4 行中&#xff0c;我们总能决定哪一个应聘者最佳。则意味着我们知道应聘…

png图片压缩后黑底问题解决

问题背景 使用thumbnail对图片进行压缩&#xff0c;偶然会发现对png图片出现黑底的情况如下&#xff1a; 压缩前 压缩后 问题解决 对网上搜到的解决方法主要有两种&#xff1a; 1.指定png输出 JAVA - Get black background when uploading PNG image - Stack Overflow 一…

大数据好找工作么?前景如何

大数据好不好找工作不是一概而论的&#xff0c;要根据你个人的学历情况&#xff0c;掌握技能程度&#xff0c;所在城市招聘需求&#xff0c;甚至是你的面试能力和简历是否突出优势有关。 但是毋庸置疑的是&#xff0c;大数据目前的发展前景还是相当优秀的。 我们知道&#xf…

什么是测试开发,聊聊我对测试开发的看法

目录 前 还没来阿里之前&#xff0c;我对测开的看法 多数人眼中的测试开发 来了阿里之后&#xff0c;对测开看法有了转变 阿里的测开是干嘛的 测试平台的好处和不足 我对测试平台的看法 测试平台是测开必需品吗&#xff1f; 实际项目中用不到测试平台&#xff0c;有必要…

GIT | 日常命令查阅表

最近公司代码管控比较乱&#xff0c;有天就利用分支进行了代码梳理&#xff0c;当时就遇到一些困惑&#xff0c;抽空就把git 再学了一下。 以前我是用git命令的&#xff0c;但是敲命令对我来说还是有点麻烦&#xff08;主要是git 功力不够&#xff09;&#xff0c;看到有同事用…