基数排序法

(一)前言

刚刚学完老韩的基数排序法,跑到这里写一篇博客记录一下,防止自己忘记。

(二)方法介绍

基数排序法是继承自桶排序,所以它是一个典型的空间换取时间的排序算法。

(三)例子介绍

1、首先以下面这个数组为数据

int[] arr = {53, 3, 542, 748, 14, 214}

2、然后再定义10个桶,这里桶主要是用于存储相同位上数字相同的数字(也就是个位相同的放在一起、十位相同的放在一起、百位相同的放在一起)(当然,这是一个向上递增的过程,不是一下子 个十百 全部做完)。

基数排序法_第1张图片

3、然后按照规则,将数据到桶中

基数排序法_第2张图片

4、再将数据按从左至右把它取出来

取出来的数据覆盖原来的arr数组 

arr = {542,53,3,14,214,748}

5、再重复2、3步骤,将数据放进去又取出来……

注意:现在的规则要按十位、百位 来了

基数排序法_第3张图片

基数排序法_第4张图片

……

由此我们可以发现,随着2、3 步骤的不断进行,小的数慢慢就排在了前面,这样就是基数排序法地端倪了。

(四)代码解释

(在这里我先插入一段代码,后面解读)

package RadixSorting;

import java.util.Arrays;

public class RadixSort {
    public static void main(String[] args) {
        int[] arr = {53,3,542,748,14,214};
        radixSorting(arr);
        System.out.println(Arrays.toString(arr));
    }

    /**
     * 基数排序
     */
    public static void radixSorting(int[] arr){
        int max = arr[0];
        for(int element: arr){
            if(element > max){
                max = element;
            }
        }
        int maxLength = (max + "").length();
        int[][] bucket = new int[10][arr.length];       //定义10个桶存放数据
        int[] bucketElementCounts = new int[10];        //定义10个计数器用于记录每个桶的数据


        for(int i = 0,n = 1;i < maxLength;++i,n*=10){
            //往桶里和计数器里存放相应的数据
            for(int j = 0;j < arr.length;++j){
                int digitOfElement = arr[j] / n % 10;
                bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
                bucketElementCounts[digitOfElement]++;
            }
            //取出数据重新放到arr[][]数组之中
            int index = 0;
            for(int k = 0;k < bucketElementCounts.length;++k){
                if(bucketElementCounts[k] != 0){
                    for(int l = 0;l < bucketElementCounts[k];++l){
                        arr[index] = bucket[k][l];
                        index++;
                    }
                }
                bucketElementCounts[k] = 0;
            }
        }
    }
}

1)main()方法准备

public static void main(String[] args) {
        int[] arr = {53,3,542,748,14,214};
        radixSorting(arr);
        System.out.println(Arrays.toString(arr));
    }

这个比较简单,就不赘述了,读者也可以看明白

2)radixSorting方法

因为是桶排序,所以我们需要准备桶

int[][] bucket = new int[10][arr.length];
  • 当我们检索这个桶的时候,我们需要一个索引指针,当然,在JAVA中,索引完全可以用一个int类型的index替代。
  • 我们需要为每一个桶准备一个指针,所以定义一个数组,数组中的每个数字对应着的上面桶中到底有几个数字
int[] bucketElementCounts = new int[10];

后面就是基数排序法的核心代码

for(int i = 0,n = 1;i < maxLength;++i,n*=10){
    //往桶里和计数器里存放相应的数据
    for(int j = 0;j < arr.length;++j){
        int digitOfElement = arr[j] / n % 10;
        bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
        bucketElementCounts[digitOfElement]++;
    }
    //取出数据重新放到arr[][]数组之中
    int index = 0;
    for(int k = 0;k < bucketElementCounts.length;++k){
        if(bucketElementCounts[k] != 0){
            for(int l = 0;l < bucketElementCounts[k];++l){
                arr[index] = bucket[k][l];
                index++;
            }
        }
        bucketElementCounts[k] = 0;
    }
}
  • 最外面的for循环主要为的是需要的排序次数,及从个 --> 十 --> 百 --> ……的比较次数,用i < maxlength 判断。
  • 中间第一层for是往桶中放数据的过程。
  • 后面的for是将桶中数据按顺序取出的过程。注意这里有一关键的一步,就是
  • bucketElementCounts[k] = 0;它保证了每次放入、取出都没有上一次的数据干扰。

你可能感兴趣的:(数据结构与算法)