Fork me on GitHub

排序算法之基数排序

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、效率分析

 

posted @ 2015-08-25 17:02  何海洋  阅读(511)  评论(0编辑  收藏  举报