基数排序如何实现

news/2024/12/24 21:42:33 标签: 排序算法, 快速排序

文章目录

    • 基数排序
      • 简介
      • 实现原理
      • 基本解法:
      • 举例:
      • java代码

基数排序

简介

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。

实现原理

基数排序的发明可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机(Tabulation Machine)上的贡献。它是这样实现的:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

基本解法:

首先有十个桶,从前往后为0-9。

1.从前往后,先将每个数的个位数取出,然后将这个数放入对应的桶中 比如:17,22,17的个位数为7,就将17放入代表7的那个桶, 将22,放入代表2的那个桶。

2.放完之后将桶中的元素,从前往后取出放回arr数组中。

3.取出十位,重复前两个步骤,然后取百位,…

4.当将最高位放入桶中,并取出放回数组中时,数组就是一个有序数组了

举例:

初始序列:81, 22, 73, 93, 43, 14, 55, 65, 28, 39
第一次:

将个位取出,然后将这个数放入对应的桶中
0:
1:81
2:22
3:73,93,43
4:14
5:55,65
6:
7:
8:28
9:39
取出后数组序列为:
81,22,73,93,43,14,55,65,28,39

第二次:

比较十位

0:
1:14
2:22,28
3:39
4:43
5:55
6:65
7:73
8:81
9:93

取出后序列:
14,22,28,28,43,55,65,73,81,93

将最高位放入桶中取出来后,序列就是一个有序队列了。

java代码

package sort.rasix;

import java.util.Arrays;

/**
 * @ClassName: RadixSort
 * @Author
 * @Date 2021/11/29
 */
public class RadixSort {
    public static void main(String[] args) {
        int[] arr = {1,23,3};
        radixSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void 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();
        //System.out.println(maxLength);
        //定义一个二维数组,长度为10,代表0-9,每个数组的长度为arr.length,
        int[][] bucket = new int[10][arr.length];
        //定义一个数组,用来存储每个数组实际存储数字的个数;
        int[] bucketSize = new int[10];



        //将数据装入数组中
        // i 代表的是位数 先比较个位 然后是十位 .....
        for (int i = 0,n=1; i < maxLength; i++,n*=10) {
            //对数组中的元素进行处理
            for (int value : arr) {

                int num = value / n % 10;

                bucket[num][bucketSize[num]] = value;

                bucketSize[num]++;
            }

            int index = 0;

            for (int k = 0; k < 10; k++) {
                if (bucketSize[k] != 0) {
                    for (int j = 0; j < bucketSize[k]; j++) {
                        arr[index] = bucket[k][j];
                        index++;
                    }

                    bucketSize[k] = 0;
                }
            }
        }
        //用来给arr中存排序的数据


    }
}


http://www.niftyadmin.cn/n/1440998.html

相关文章

(三) 创建Hello-Service提供者 - Spring Cloud复习笔记

&#xff08;三&#xff09; 创建Hello-Service提供者 - Spring Cloud学习笔记 1、核心技术选型&#xff1a; Maven&#xff1a;3.3.9  JDK&#xff1a; 1.8.0_144  spring-boot-starter-parent&#xff1a; 2.0.3.RELEASE  spring-cloud-dependencies&#xff1a; Finch…

从Alexa网站排名,看IT门户走势(转)

经常有人拿 Alexa 网站提供的全球网站排名服务&#xff0c;与《财富》的世界 500 强企业排名及《福布斯》全球富豪排名等相提并论&#xff0c;称其为第三方全球排名权威机构。 Alexa 网站所提供的关于网站的动态数据、流量信息、质量分析等高质量服务&#xff0c;再加上与 goog…

掌握react,这一篇就够了

react众所周知的前端3大主流框架之一&#xff0c;由于出色的性能&#xff0c;完善的周边设施风头一时无两。本文就带大家一起掌握react。 jsx语法 前端MVVM主流框架都有一套自己的模板处理方法&#xff0c;react则使用它独特的jsx语法。在组件中插入html类似的语法&#xff0c;…

对象与类的简介

文章目录前言类对象前言 面向对象程序设计&#xff08;简称OOP&#xff09;是当今主流的程序设计范型&#xff0c;它已经取代了20世纪70年代的“结构化”过程化程序设计开发技术。Java是完全面向对象的&#xff0c;必须熟悉OOP才能够编写Java程序。 面向对象的程序是由对象组…

Nginx 基本介绍

同类产品 同类竞争产品&#xff0c;Apache&#xff0c;Tomcat&#xff0c;IIS等。 Tomcat面向Java。 IIS只能在Windows上运行。 Apache有很多优点&#xff0c;稳定&#xff0c;开源&#xff0c;跨平台。但是它比较重&#xff0c;而且不支持高并发。 Nginx是轻量级&#xff0c;高…

Win Server2003常见问题及解决然方案(转)

随着windows server 2003的上市在即&#xff0c;很多人可以用上的泄漏的版本&#xff0c;相对于工作站系统&#xff0c;服务器在由于做了更多的内核优化&#xff0c;所以在稳定性和安全性方面有很大的提高。但是&#xff0c;很多人并不是需要Server的全部功能的&#xff0c;而且…

java开发插件Lombok

lombok的下载 lombok.jar软件包地址 链接&#xff1a;https://pan.baidu.com/s/1K1r3XirJbMzb2VLNH6f7Vg 提取码&#xff1a;6666 先看效果&#xff1a; 在没有手写getter&#xff0c;setter&#xff0c;等方法的前提下&#xff0c;左边依然可以看见这些方法&#xff0c;这个工…

一文读懂什么是Java中的自动拆装箱

前言 本文主要介绍Java中的自动拆箱与自动装箱的有关知识。、 基本数据类型 基本类型&#xff0c;或者叫做内置类型&#xff0c;是Java中不同于类(Class)的特殊类型。它们是我们编程中使用最频繁的类型。 Java是一种强类型语言&#xff0c;第一次申明变量必须说明数据类型&…