zoukankan      html  css  js  c++  java
  • 数据结构Java版之基数排序(四)

    基数排序:

      基数排序分为两种:第一种是LSD ,从最低位开始排序, 第二种是 MSD 从最高位开始排。这里介绍第一种LSD排序算法。

    首先,我们先了解什么是基数。基数是根据具体的排序情况而定的,比如我们常见的基数是十进制-10,还有二进制-2。

    其次,要熟记基数排序的思想:通过对每一个位上的值相排序,就可以完成对整个数组的排序。

      基数排序的算法实现流程:遍历所有数组元素,找出元素最大的位值 -------->从低位到高位把数组元素上的位值存入链表中-------->遍历所有链表,将链表里面的值重新赋值给数组,再情况链表。

      例如:对数组   int[ ]  data = {421, 240, 35, 532, 305, 430, 124};进行排序,首先我们要做的是对个位上的数值进行排序。

    第一遍排序的结果为:  240 430 421 532 124 35 305 

    再进行十位上的数值排序:

    第二遍排序的结果为:  305 421 124 430 532 35 240

    再进行百位上的数值排序:

    第三遍排序的结果为:  35 124 240 305 421 430 532 

    最后我们的到的排序结果就是: 35 124 240 305 421 430 532 

    至此,已经完成了对数组的排序

      附源码:

    public class RadixSort {
        @Test
        public void fun() {
            int[] n = {421, 240, 35, 532, 305, 430, 124};
            radixSort(n);
            for(int i : n) {
                System.out.print(i + " ");
            }
        }
        //实现基数排序 LSD-从最低位开始排 MSD-从最高位开始排
        public void radixSort(int[] data) {
            int maxBin = maxBin(data);
            List<List<Integer>> list = new ArrayList<List<Integer>>();
            for(int i  = 0; i < 10; i ++) {
                list.add(new ArrayList<Integer>());
            }
            for(int i = 0, factor = 1; i < maxBin; factor *= 10, i ++) {
                for(int j = 0; j < data.length; j ++) {
                    list.get((data[j]/factor)%10).add(data[j]);
                }
                for(int j = 0, k = 0; j < list.size(); j ++) {
                    while(!list.get(j).isEmpty()) {
                        data[k] = list.get(j).get(0);
                        list.get(j).remove(0);
                        k ++;
                    }
                }
            }
        }
        //计算数组里元素的最大位数
        public int maxBin(int[] data) {
            int maxLen = 0;
            for(int i = 0; i < data.length; i ++) {
                int size = Integer.toString(data[i]).length();
                maxLen =  size > maxLen ? size : maxLen;
            }
            return maxLen;
        }
    }
  • 相关阅读:
    中国SNS用户体验设计分析和互动性浅析
    jQuery的运行机制和设计理念
    Web前端工程师如何给自己定位?
    用户体验这点事儿
    css selection改变文字反选的背景颜色
    HTTP 状态代码
    [翻译]导致网站可用性差的十个最常见问题
    前端开发中的一些用户体验细节
    SQL的行转列问题
    ASP.NET动态添加文本框参考做法
  • 原文地址:https://www.cnblogs.com/ranter/p/9197983.html
Copyright © 2011-2022 走看看