首页 > 其他分享 >基数排序(这里假设数据的最高位为3)

基数排序(这里假设数据的最高位为3)

时间:2023-09-19 22:32:32浏览次数:30  
标签:int 假设 ++ 基数排序 bucketElementCount 数组 array 数据 位为

基本思想:在需要排序的一串数据中,取最长位数为参考,不足最长位数的数据要在前面补零,然后形成一串相同位数的数据,最后通过比较这串数据的个位数,十位数,百位数….最后就会得到一个有序的序列。 用Java实现如下所示:

import java.util.Arrays;

public class Test1 {
    public static void main(String[] args) {
        //创建一个数组
        int[] array = new int[]{53, 542, 3, 63, 14, 214, 154, 748, 616};
        System.out.print("原数据为:" + Arrays.toString(array));
        sort(array);
        System.out.print("\n通过基数排序后的数据为:" + Arrays.toString(array));

    }

    //基数排序的方法
    public static void sort(int[] array) {
        //获取最大位数
        int max = array[0];
        for (int i = 0; i < array.length; i++) {
            if (array[i] > max) {
                max = array[i];
            }
        }
        //把int类型转换为String类型 ,便于统计位数
        int maxLenth = (max + "").length();

        //定义二维数组,作用为桶,桶的大小为上面需要排序的一维数组的大小,数量为10个
        /**
         * 作用:首先求出数据的个位数,然后通过个位数来确定数组下标,通过个位数将数据放入对应的桶中
         *      然后取出数据,再通过十位数确定下标,将数据放入对应的桶中
         *      再次取出数据,再通过百位数确定下标,然后将数据放入对应的桶中,最后得到一个有序的序列
         *
         *      注意:这里需要一个辅助数组,这个数组里面的下标值为几号桶,对应的数据为桶中有几个有效的数据,利用辅助数组的特点可以利用来确定数据放入桶中时放入那一个索引
         *      因为如果桶中的前面有数据时,就不能直接放入其中,而需要接着放在桶中的后面,所以我们需要使用辅助数组来确定我们具体应该放在那一个索引位置中。
         *
         * */
        int[][] bucket = new int[10][array.length];
        //定义辅助数组
        int[] bucketElementCount = new int[10];
        //循环无序的序列
        for (int i = 0; i < array.length; i++) {
            //获取个位数
            int locationElement = array[i] % 10;
            //通过辅助数组确定将数据放入桶中的什么位置
            bucket[locationElement][bucketElementCount[locationElement]] = array[i];
            //修改辅助数组中的值
            bucketElementCount[locationElement]++;
        }

        //原数组的索引
        int index = 0;
        //通过辅助数组来遍历桶中的数据,并且将数据放入原数组中
        for (int i = 0; i < bucketElementCount.length; i++) {
            if (bucketElementCount[i] != 0) {
                //通过辅助数组的值来判断循环的次数
                for (int j = 0; j < bucketElementCount[i]; j++) {
                    //将桶中的数据赋值给原数组
                    array[index++] = bucket[i][j];
                    //将桶中的数据置零
                    bucket[i][j] = 0;
                }
                //将赋值数组置零
                bucketElementCount[i] = 0;
            }
        }
        //将原数组索引置零
        index = 0;

        //判断十位数
        for (int i = 0; i < array.length; i++) {
            //获取十位数
            int locationElement = array[i] / 10 % 10;
            //通过辅助数组确定将数据放入桶中的什么位置
            bucket[locationElement][bucketElementCount[locationElement]] = array[i];
            //修改辅助数组中的值
            bucketElementCount[locationElement]++;
        }
        //通过辅助数组来遍历桶中的数据,并且将数据放入原数组中
        for (int i = 0; i < bucketElementCount.length; i++) {
            if (bucketElementCount[i] != 0) {
                //通过辅助数组的值来判断循环的次数
                for (int j = 0; j < bucketElementCount[i]; j++) {
                    //将桶中的数据赋值给原数组
                    array[index++] = bucket[i][j];
                    //将桶中的数据置零
                    bucket[i][j] = 0;
                }
                //将赋值数组置零
                bucketElementCount[i] = 0;
            }
        }
        //将原数组索引置零
        index = 0;

        //判断百位数
        for (int i = 0; i < array.length; i++) {
            //获取个位数
            int locationElement = array[i] / 100;
            //通过辅助数组确定将数据放入桶中的什么位置
            bucket[locationElement][bucketElementCount[locationElement]] = array[i];
            //修改辅助数组中的值
            bucketElementCount[locationElement]++;
        }
        //通过辅助数组来遍历桶中的数据,并且将数据放入原数组中
        for (int i = 0; i < bucketElementCount.length; i++) {
            if (bucketElementCount[i] != 0) {
                //通过辅助数组的值来判断循环的次数
                for (int j = 0; j < bucketElementCount[i]; j++) {
                    //将桶中的数据赋值给原数组
                    array[index++] = bucket[i][j];
                    //将桶中的数据置零
                    bucket[i][j] = 0;
                }
                //将辅助数组置零
                bucketElementCount[i] = 0;
            }
        }


    }

}

输出结果如下所示:

原数据为:[53, 542, 3, 63, 14, 214, 154, 748, 616]
通过基数排序后的数据为:[3, 14, 53, 63, 154, 214, 542, 616, 748]

标签:int,假设,++,基数排序,bucketElementCount,数组,array,数据,位为
From: https://blog.51cto.com/u_15433911/7529923

相关文章

  • 堆排序 桶排序 基数排序
    堆排序使用数组和表示堆大小的整数heapSize表示堆:vector<int>arr{9,5,3,7,2};intheapSize=5;heapSize=5表示数组从索引0开始的5个元素表示一个堆。堆结构就是用数组实现的完全二叉树结构。求数组中索引i位置节点的父子节点:父节点:(i-1)/2左子节点:2*i+1右子节......
  • 基数排序
     基数排序,不是基于比较的排序。过程如下:处理过程:  桶排过程:1voidBucket_sort(inta[],intexp)//exp为1按个位排序,exp为10按十位排序,exp为100按个位排序,……2{3vector<int>Bucket[20];45//按位入桶,+10是为了对付负数6for(int......
  • 【数据结构】排序 归并排序和基数排序
    1.归并排序归并排序中的"归并"的意义就是把多个有序表合并为一个新的有序表。算法思想:二路归并排序:初始情况下将长度为n的待排序表分为n个子表,则每个子表的长度为1,是有序的。每趟排序尽量将这些子表按位置相邻两两归并,重复直到合并为一个长度为n的有序表为止。具体实现:在归......
  • 归并,基数排序及排序分析
    归并,基数排序及排序分析归并排序将两个或两个以上的有序子序列"归并"为一个有序的序列.归并排序的演示归并需要logn趟如何将两个有序序列合成一个有序序列?使用前面学的两个线性表的合并在同一个有序序列里面的合并操作归并排序算法分析归并排序方法的比较基数......
  • 基数排序
    博客地址:https://www.cnblogs.com/zylyehuo/#-*-coding:utf-8-*-#O(n)O(kn)#NBO(nlogn)importrandomdefpartition(li,left,right):tmp=li[left]whileleft<right:whileleft<rightandli[right]>=tmp:#从右面找比tmp小的数......
  • 基数排序详解
    基数排序详解1)前言:计数排序要学基数排序,掌握计数排序非常重要。计数排序的原理十分的简单。举个例子,排序52413,你打算怎么办?很简单是不是,冒泡排序、选择排序、归并排序……这些都足以解决。但如果你有100000000个数要排序,你可能就要束手就擒了。那如归这时候我告诉你:这1000......
  • 异常检测——无监督、高斯分布模型,需要带标记的样本数据,基本假设:特征符合高斯分布
    给定数据集x(1),x(2),..,x(m),我们假使数据集是正常的,我们希望知道新的数据xtest是不是异常的,即这个测试数据不属于该组数据的几率如何。我们所构建的模型应该能根据该测试数据的位置告诉我们其属于一组数据的可能性p(x)。......
  • 1-20 编写程序 detab,将输入中的制表符替换成适当数目的空格,使空格充满到 下一个制表
    ArchlinuxGCC13.1.1 202304292023-07-1710:30:52星期一 制表符的作用是将光标移至最接近8的整数倍的位置,比如1~8>9,9~16>17等等,我常用制表符为4width,所以,1~4>5,5~8>9...点击查看代码#include<stdio.h>#definetab_width4//自己常用设置为4,故此......
  • Probability•概率的公理化定义•确定概率的方法{频率, 古典, 几何, 主观}•Joseph Lo
    Probability概率的公理化定义非负性正则性互不相容的可列可加性确定概率的方法:频率古典几何:约会题:时间段内等一段时间Buffon'sNeedle+Monte-CarloMethod:针中心与最近直线的距离K与夹角α主观:统计界的贝叶斯学派认为,事件概率是人们根据经验对事件发生可能性......
  • 基数排序
    最近又有个奇奇怪怪的题目,数据为\(n\le1\times10^7\),并且还要用到排序,普通的排序肯定会超时,然后就发现了一种\(O(n)\)介绍基数排序(RadixSort)是桶排序的扩展,它是将整数按位数切割成不同的数字,然后按每个数位分别比较以此来排序。说详细点,也就是将所有数字统一为同样的......