内排序-基数排序

算法思想:对于纯整形数据,将整数按位数切割成不同的数字,然后按每个位数的值依次分别归类,假定该序列最大长度的数 为n位 ,那么经历n次归类以后该序列将呈现有序。

不多说了,直接上代码:

package Sort;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;

public class KeyWordSort
{
    // 关键字桶
    HashMap<Integer, ArrayList<Integer>> bucket = new HashMap<Integer, ArrayList<Integer>>();

    public static void main(String[] args)
    {
        int[] a = new int[] { 20, 30, 90, 40, 70, 110, 60, 10, 100, 50, 80, 1, 2 };// 待排序列
        KeyWordSort keyWordSort = new KeyWordSort();
        keyWordSort.sort(a);
        
        for (int t : a)
        {
            System.out.println(t);
        }
        
    }
    public void sort(int[] datas)
    { 
        initbucket(); // 初始化桶
        for (int d = 1; d <= 3; d++)
        {

            for (int i = 0; i < datas.length; i++)
            {
                int key =  GetKey(datas[i], d);// 得到关键字
                 inputbucket(datas[i], key);// 将值,关键字 放入桶中
            }
            Integer[] res =   outputbucket();// 完成一轮排序

            for (int j = 0; j < datas.length; j++)
            {
                datas[j] = res[j];// 将排序结果写回
            }
            initbucket();// 重置桶
        }
        
    }
    private void inputbucket(int value, int key)
    {
        bucket.get(key).add(value);
    }

    private Integer[] outputbucket()
    {
        ArrayList<Integer> bArrayList = new ArrayList<Integer>();

        for (Entry<Integer, ArrayList<Integer>> entry : bucket.entrySet())
        {
            for (int i : entry.getValue())
            {
                bArrayList.add(i);

            }
        }
        Integer[] a = new Integer[bArrayList.size()];
        return bArrayList.toArray(a);

    }

    private void initbucket()
    {
        for (int i = 0; i <= 9; i++)
        {
            bucket.remove(i);
            bucket.put(i, new ArrayList<Integer>());
        }
    }

    private int GetKey(int value, int d)// d默认是1 即从个位开始
    {
        int t = value;
        while (d > 0)
        {
            t = value % 10;// 得到最右边的数
            value = value / 10;
            d--;

        }
        return t;
    }

    

}

猜你喜欢

转载自www.cnblogs.com/mytrip/p/9485636.html