基数排序

来源:互联网 发布:linux删除整个文件夹 编辑:程序博客网 时间:2024/06/03 09:40

思想:

将所有数字从最低位(最高位)开始,每个数相同位比较排序,然后再排下一位,当所有数的所有位都比较结束时,构成了有序。

实现思路

一、初始化ArrayList长度为10;对应0~9,作为桶,桶内数据不排序
二、当取到最高位数是停止循环,也就是当所有数据归到0这个桶里时
三 、所有数进桶,根据相应的位的数映射相应的桶
四、所有数据进桶后,使用辅助数组复制所有桶,并清空桶中所有数据,准备下一次入桶。

实现代码

package sort;import java.util.ArrayList;import java.util.Random;public class RadexSort {    private static ArrayList[] helper = new ArrayList[10];    /*     * 不能使用foreach初始化,否则初始化不成功     */    static {        for (int i = 0;i<helper.length;i++ ) {            helper[i]=new ArrayList();        }    }    /**     * 基数排序,从数的低位或者高位开始排列,低位从个位开始排列,入桶后不需要排序,不需要插入;     *        开始以自己写的链表作为容器,可能是功力不够,所以很慢,而后改成了使用java 的ArrayList作为容器还过的去;     * @param arr     */    public static void radexSort(int[] arr) {        int d = 0;        int point = 0;        while (true) {            d++;            for ( int i : arr ) {                point = getDigit(i, d);                inputBucket(point, i);            }            if (helper[0].size() == arr.length) {                break;            }            int index = 0;            for ( ArrayList list : helper ) {                for ( Object obj : list ) {                    arr[index++] = (Integer) obj;                }            }            cleanAll();        }    }    private static void cleanAll() {        for ( ArrayList list : helper ) {            list.clear();        }    }    private static void inputBucket(int point, int i) {        switch (point) {            case 0:                helper[0].add(i);                break;            case 1:                helper[1].add(i);                break;            case 2:                helper[2].add(i);                break;            case 3:                helper[3].add(i);                break;            case 4:                helper[4].add(i);                break;            case 5:                helper[5].add(i);                break;            case 6:                helper[6].add(i);                break;            case 7:                helper[7].add(i);                break;            case 8:                helper[8].add(i);                break;            case 9:                helper[9].add(i);                break;        }    }    private static int getDigit(int i, int d) {        return i / (int) Math.pow(10, d - 1) % 10;    }    public static void main(String[] args) {         int[] arr = new int[100000000];         for ( int i = 0; i < arr.length; i++ ) {         arr[i] = new Random().nextInt(100000000);         }         System.out.println(1);//        int[] arr = { 123, 1, 8, 28, 46, 36, 27 };        long startTime = System.currentTimeMillis();        RadexSort.radexSort(arr);        long endTime = System.currentTimeMillis();        System.out.println(endTime - startTime);//        for ( int i : arr ) {//            System.out.println(i);//        }    }}
原创粉丝点击