该死的基数排序!(java代码实现)

基数排序基本思想

先按数组每个数的个位数进行排序 再将十位数排序 再将百位数排序 以此类推 没有十位数百位数…的补0。当所有位上的数排完序后 整个数组就是有序的。底下有java代码实现。

-----以下是具体实现步骤

1. 先获取数组中的最大数 目的是需要知道一共有几位数 排几次序。

2. 定义一个临时数组 int[] temp = new int[array.length]每次排好序就将他们放进这个临时数组。

4. 定义一个桶数组 桶的索引是0到9 遍历数组将每个数(对应位的数字)放进与之对应的桶里 并且计算桶里数的个数。

5. 再次遍历这个桶数组,将桶里数的个数变为 前面桶的个数加上自己桶里的个数 (bucket[i] += bucket[i-1]) 这一步完成之后 我们就可以从桶里知道对应数排序后的位置
索引就是其位置-1。

4. 既然可以知道每位数排序后的索引了 那我们就来开始排序: 从后遍历该数组 特别注意是从后遍历数组 根据该数对应位上的数字找到对应的桶从而得到桶里的数字i 该数排序后的索引位置就为i-1 之后将其放入临时数组中 temp[i-1];
别忘了该桶里的数字还要-1 因为 下一个相同的数来找索引 需要放在上一个数的前面;

5. 最后一步我们需要把临时数组中的数赋值给原数组 然后接着下一位数的排序

下面是从网上找的个位数排序的图片 帮助理解排序过程
该死的基数排序!(java代码实现)_第1张图片
该死的基数排序!(java代码实现)_第2张图片
补充一点
我看的时候 第四步需要从后遍历数组这一细节 我想了蛮久可能因为我比较笨 说下原因
因为如果从前遍历该数组 当碰到相同的数时 相同数的相对位置就变了 原来在后面的数就会排到前面去 这个排序就不稳定了
举个例子 比如一个数组 【0,11,2,3,1,5,5,8,7】
当进行个位数上的排序时 就是对【0,1,2,3,1,5,5,8,7】进行排序
当我们从前遍历数组排序后 原数组顺序变为 【0,1,11,2,3,5,5,7,8】
这2个5的位置就变了 这个时候还没有关系 只是发现稳定性没有了
但是更重要的是当我们接着进行十位数排序时 就是对【0,0,1,0,0,0,0,0,0】排序
原本我们以为进行这次排序后整个数组就是有序的
但是我们发现由于没有十位数的数字 补0 导致有很多0 如果从前遍历 前面的0上所代表的数就会排到后面去(因为桶里的个数依次减一) 原来的相对顺序就会变了 导致排序失败
所以我们必须从后往前遍历数组进行排序!!!!!!!!!!!!

以下是java代码实现

/**
 * 基数排序
 * Created by 周大侠
 * 2019-02-22 18:29
 */
public class RadixSort {
    public void radixSort(int[] array) {
        int max = getMax(array);
        int bit = 1;
        while(max / bit > 0) {
            radix(array, bit);
            bit *= 10;
        }
    }
    private void radix(int[] array, int bit) {
        int[] temp = new int[array.length];
        int[] bucket = new int[10];
        for(int i = 0; i < array.length; i++) {
            bucket[(array[i] / bit) % 10]++;
        }
        for(int i = 1; i < bucket.length; i++) {
            bucket[i] += bucket[i-1];
        }
       for(int i = array.length - 1; i >= 0; i--) {
            temp[bucket[(array[i] / bit) % 10] - 1] = array[i];
            bucket[(array[i] / bit) % 10]--;
        }
        for(int i = 0; i < temp.length; i++) {
            array[i] = temp[i];
        }
    }

    private int getMax(int[] array) {
        int max = array[0];
        for(int i = 1; i < array.length; i++){
            if(array[i] > max) {
                max = array[i];
            }
        }
        return max;
    }
    public static void main(String[] args) {
        int[] array = {0,2,11,3,1,5,9,8,7};
        new RadixSort().radixSort(array);
        for (int i : array) {
            System.out.println(i);
        }
    }
}

你可能感兴趣的:(排序)