IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> java 实现基数排序 -> 正文阅读

[数据结构与算法]java 实现基数排序

基数排序

将数组中的每个数分别按个位、十位、百位…进行排序。

获取数中的每一位

public static void main(String[] args){
        int number = 23456;
        int bit;

        // 个位
        System.out.print("该数的个位:");
        bit = number % 10;
        System.out.println(bit);

        // 十位
        System.out.print("该数的十位:");
        bit = number / 10 % 10;
        System.out.println(bit);

        // 百位
        System.out.print("该数的百位:");
        bit = number / 100 % 10;
        System.out.println(bit);

        // 千位
        System.out.print("该数的千位:");
        bit = number / 1000 % 10;
        System.out.println(bit);

        // 万位
        System.out.print("该数的万位:");
        bit = number  / 10000 % 10;
        System.out.println(bit);
}
该数的个位:6
该数的十位:5
该数的百位:4
该数的千位:3
该数的万位:2

基本实现

// 基数排序
public class RadixSort {
    // 排序
    public int[] sort(int[] array){
        if(array.length == 0)
            return null;
        //找到最大值的位数
        int maxBit = 1;
        int number = 10; // 10,100,1000...
        for(int i = 0;i < array.length;i ++){
            if(array[i] >= number){
                number = number * 10;
                maxBit ++;
            }
        }
        System.out.println("最大值的位数:" + maxBit);
        return sort(maxBit,array);
    }

    // 实现排序
    // 传入最大值的位数,要排序的数组
    private int[] sort(int maxBit,int[] array) {
        // 创建二维数组来储存每次得到的数
        int[][] arrays = new int[10][array.length]; // 二维数组里创建十个数组,长度为要排序数组长度
        int[] numberes; // 记录二维数组中每个数组内的个数
        // 排个位
        numberes = new int[10];
        int bit;  // 取余得到的数
        for (int i = 0; i < array.length; i++) {
            // 拿到每个数的个位
            bit = array[i] % 10; // 取余
            // 将排序数组中的数添加到二维数组中相应的位置
            arrays[bit][numberes[bit]] = array[i];
            // 个数加1
            numberes[bit]++;
        }
        // 得到新数组
        int index = 0; // 排序数组的索引
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < numberes[i]; j++) {
                array[index] = arrays[i][j];
                index++;
            }
        }
        System.out.println("第一次排序:");
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + "  ");
        }
        System.out.println();

        // 排十位
        numberes = new int[10];
        int s_bit;
        for (int i = 0; i < array.length; i++) {
            s_bit = (array[i] / 10) % 10;
            arrays[s_bit][numberes[s_bit]] = array[i];
            numberes[s_bit]++;
        }
        int s_index = 0;
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < numberes[i]; j++) {
                array[s_index] = arrays[i][j];
                s_index++;
            }
        }
        System.out.println("第二次排序:");
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + "  ");
        }
        System.out.println();
        
        // 第三次排序
        numberes = new int[10];
        int t_bit;
        for (int i = 0; i < array.length; i++) {
            t_bit = (array[i] / 100) % 10;
            arrays[t_bit][numberes[t_bit]] = array[i];
            numberes[t_bit]++;
        }
        int t_index = 0;
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < numberes[i]; j++) {
                array[t_index] = arrays[i][j];
                t_index++;
            }
        }
        System.out.println("第三次排序:");
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + "  ");
        }
        System.out.println();
        
        return array;
    }
}

测试类

// 测试类
public class Demo {
    public static void main(String[] args) {
        int[] array = new int[]{10,2,9,121,28,56,88,137};
        RadixSort sort = new RadixSort();
        array = sort.sort(array);
        System.out.println();
        System.out.println("排好序的数组:");
        for(int i : array){
            System.out.print(i + "  ");
        }
    }
}

结果

最大值的位数:3
第一次排序:
10  121  2  56  137  28  88  9  
第二次排序:
2  9  10  121  28  137  56  88  
第三次排序:
2  9  10  28  56  88  121  137  
排好序的数组:
2  9  10  28  56  88  121  137    

优化

// 基数排序
public class RadixSort {
    // 排序
    public int[] sort(int[] array){
        if(array.length == 0)
            return null;
        //找到最大值的位数
        int maxBit = 1;
        int number = 10;
        for(int i = 0;i < array.length;i ++){
            if(array[i] >= number){
                number = number * 10;
                maxBit ++;
            }
        }
        System.out.println("最大值的位数:" + maxBit);
        return sort(maxBit,array);
    }

    // 实现排序
    private int[] sort(int maxBit,int[] array){
        // 二维数组储存每次得到的数
        // 创建二维数组来储存每次得到的数
        int[][] arrays = new int[10][array.length]; // 二维数组里创建十个数组,长度为要排序数组长度
        int[] numberes; // 记录二维数组中每个数组内的个数
        int bit; // 每次取余得到的数
        int index; // 排序数组的索引
        int flag = 0;  // 如果是排个位
        int num = 1; 
        while(flag < maxBit){
            if(flag == 0)
                num = 1;
            else
                num = num * 10;
            numberes = new int[10];
            for(int i = 0;i < array.length;i ++){
                // 拿到每个数的位
                bit = (array[i] / num) % 10; // 取余
                // 添加到二维数组中
                arrays[bit][numberes[bit]] = array[i];
                // 个数加1
                numberes[bit] ++;
            }
            // 得到的新数组
            index = 0;
            for(int i = 0;i < 10;i ++){
                for(int j = 0;j < numberes[i];j ++){
                    array[index] = arrays[i][j];
                    index ++;
                }
            }
            System.out.println("第"+ flag + "次排序:");
            for(int i = 0;i < array.length;i ++){
                System.out.print(array[i] + "  ");
            }
            System.out.println();
            flag ++;
        }
        return array;
    }
}

测试类

// 测试类
public class Demo {
    public static void main(String[] args) {
        int[] array = new int[]{99,4,0,123,567,890,1439,1374};
        RadixSort sort = new RadixSort();
        array = sort.sort(array);
        System.out.println("排好序的数组:");
        for(int i : array){
            System.out.print(i + "  ");
        }
    }
}

结果

最大值的位数:40次排序:
0  890  123  4  1374  567  99  14391次排序:
0  4  123  1439  567  1374  890  992次排序:
0  4  99  123  1374  1439  567  8903次排序:
0  4  99  123  567  890  1374  1439  
排好序的数组:
0  4  99  123  567  890  1374  1439  
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-19 12:02:44  更:2022-05-19 12:03:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:28:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码