排序(八)— 基数排序

2018-12-08  本文已影响0人  Sandy_678f

基数排序的基本思想:
是桶排序的扩展,我们需要给待排序记录准备10个桶,为什么是10个??因为一个数的任何一位上,其数字大小都位于0~9之间,因此采用10个桶,桶的编号分别为0,1,2,3,4...9,对应待排序记录中每个数相应位的数值,基数排序也是因此而得名。

/**
 * FileName: RadixSort
 * Author:   Sandy
 * Date:     2018/12/8 14:25
 * Description: 基数排序
 * Version: v1.0.0
 */

package SortDemo;

public class RadixSort {

    public static int getMax(int [] list){
        int temp = list[0];
        for(int i=1; i<list.length; i++){
            if(temp<list[i])
                temp = list[i];
        }
        return temp;
    }

    public static void BitSort(int[] list, int bit){

        int index;
        int count [] = new int[10];
        int temp [] = new int[list.length];

        //计数
        for (int i=0; i<list.length;i++){
            index = (list[i]/bit)%10;
            count[index]++;
        }

        //找到每一个数在temp表中的位置
        for (int j=1; j<count.length; j++){
            count[j] += count[j-1];
        }

        //排序
        for(int i=0; i<list.length; i++){
            index = (list[i]/bit)%10;
            temp[list.length-count[index]] = list[i];
            count[index]--;
        }

        for (int i=0; i<list.length; i++)
            list[i] = temp[i];
    }

    public static  void RadixSort(int [] list){

        int max = getMax(list);

        for(int exp=1; max/exp>0; exp *= 10){
            BitSort(list, exp);
        }

    }

    public static void main(String[] args) {
        int [] list = {3,14,21,47,168,19,21,107};

        System.out.print("before sort: ");
        for (int i = 0; i < list.length; i++)
            System.out.printf("%d ",list[i]);
        System.out.println();

        RadixSort(list);

        System.out.print("after sort: ");
        for (int i = list.length-1; i >= 0; i--)
            System.out.printf("%d ",list[i]);
        System.out.println();
    }

}

基数排序时间复杂度
假设被排序的数列中有N个数,基数排序的时间复杂度是O(N*digit)。数组中最大的数是digit位数。

基数排序稳定性
归并排序是稳定的算法,它满足稳定算法的定义

上一篇 下一篇

猜你喜欢

热点阅读