zoukankan      html  css  js  c++  java
  • 排序算法之基数排序

    1、基本思想

      将所有待比较数值(正整数)统一为同样 的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

    2、代码示例

    package sort;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.junit.Test;
    
    /**
     * 基数排序 
     */
    
    public class RadixSort {
    
        @Test
        public void TestSort() {
            int a[] = { 49, 38, 65, 97, 76, 13, 27, 49, 78, 53, 51 };
            sort(a,2);
        }
    
        public void sort(int[] arr) {
            int len=arr.length;
            // 首先确定排序的趟数;
            int max = arr[0];
            for (int i = 1; i < len; i++) {
                if (arr[i] > max) {
                    max = arr[i];
                }
            }
            int time = 0;
            // 判断位数;
            while (max > 0) {
                max /= 10;
                time++;
            }
            // 建立10个队列;
            List<ArrayList> queue = new ArrayList<ArrayList>();
            for (int i = 0; i < 10; i++) {
                ArrayList<Integer> queue1 = new ArrayList<Integer>();
                queue.add(queue1);
            }
            // 进行time次分配和收集;
            for (int i = 0; i < time; i++) {
                // 分配数组元素;
                for (int j = 0; j < len; j++) {
                    // 得到数字的第time+1位数;
                    int x = arr[j] % (int) Math.pow(10, i + 1)
                            / (int) Math.pow(10, i);
                    ArrayList<Integer> queue2 = queue.get(x);
                    queue2.add(arr[j]);
                    queue.set(x, queue2);
                }
                int count = 0;// 元素计数器;
                // 收集队列元素;
                for (int k = 0; k < 10; k++) {
                    while (queue.get(k).size() > 0) {
                        ArrayList<Integer> queue3 = queue.get(k);
                        arr[count] = queue3.get(0);
                        queue3.remove(0);
                        count++;
                    }
                }
            }
            for (int i = 0; i < len; i++){
                System.out.print(arr[i]+" ");
            }
                
        }
        
        public void sort(int[] arr, int d) //d表示最大的数有多少位
        {
            int len=arr.length;
            int k = 0;
            int n = 1;
            int m = 1; //控制键值排序依据在哪一位
            int[][]temp = new int[10][len]; //数组的第一维表示可能的余数0-9
            int[]order = new int[10]; //数组orderp[i]用来表示该位是i的数的个数
            while(m <= d)
            {
                for(int i = 0; i < len; i++)
                {
                    int lsd = ((arr[i] / n) % 10);
                    temp[lsd][order[lsd]] = arr[i];
                    order[lsd]++;
                }
                for(int i = 0; i < 10; i++)
                {
                    if(order[i] != 0)
                        for(int j = 0; j < order[i]; j++)
                        {
                            arr[k] = temp[i][j];
                            k++;
                        }
                    order[i] = 0;
                }
                n *= 10;
                k = 0;
                m++;
            }
            for (int i = 0; i < len; i++){
                System.out.print(arr[i]+" ");
            }
        }
    
    }

    3、效率分析

  • 相关阅读:
    ftp 传文件完整代码(二)
    生成文件 权限 以及ftp 传数据(一)
    定时任务配置
    发送电子邮件遇到问题
    mysql 主从分离配置
    知道开始时间结束时间 计算这之间一共多少天
    mysql 语句集(二)
    mysql 的sql文件导出导入
    mysql 批量添加 更新
    Spring Boot中如何干掉if else
  • 原文地址:https://www.cnblogs.com/hehaiyang/p/4757986.html
Copyright © 2011-2022 走看看