05排序之基数排序

谁说我不能喝 提交于 2020-01-07 02:04:57

基数排序

数据结构整理目录

基本介绍

1)基数排序属于 “分配式排序,又称桶子法,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些”桶“中,达到排序的作用

2)基数排序是属于稳定性的排序,基数排序法是效率高的稳定性排序法;基数排序是经典的空间换时间的方式,占用内存很大,当对海量数据排序时,容易造成OutOfMemoryError

3)基数排序是桶排序的扩展

4)基数排序是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。;对于负数的情况,需要区别对待、

分析

基本思想

  1. 将所有待比叫数值统一为同样的数位长度,数位较短的数前面补0。然后从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列
  2. 图文解释如下

第一轮排序:

(1)将每个元素的个位数取出,然后看这个数应该放在哪个对应的桶(一个于维数组)

(2)按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4rguaDIW-1578138367494)(images/16.png)]

第二轮排序

(1)将每个元素的十位数取出,然后看这个数应该放在哪个对应的桶(一个于维数组)

(2)按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SORJiosn-1578138367495)(images/17.png)]

第三轮排序

(1)将每个元素的百位数==取出,然后看这个数应该放在哪个对应的桶(一个于维数组)

(2)按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6n8XdHYA-1578138367496)(images/18.png)]

小结:

  1. 排序的轮数与数组中的最高位数有关

代码

package F排序;

import java.util.Arrays;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/1/4 0004  19:01
 *
 */
public class RadixSort {

    public static void main(String[] args) {
        int[]  arr = {53,3,542,748,14,214};

        radixSort(arr);
    }

    //基数排序方法
    public  static void radixSort(int[] arr) {


        //先得到数组中最大的位数
        int max = arr[0]; //假设第一位最大
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }

        //得到最大数的位数
        int maxLength = (max + "").length();


        //第一轮(针对每个元素的个位数进行处理)
        //定义一个二维数组,表示10个桶,每个桶就是一个一维数组
        //1、二维数组包含10个一维数组
        //2、为了防止在存入数的时候,数据溢出,则每个一维数组(桶)。大小定位arr.length
        //3、基数排序是使用空间换时间的经典算法
        int[][] bucket = new int[10][arr.length];

        //为了记录每个桶中,实际存入多少个数据,我们定义一个一维数组来记录各个桶中每次放入的数据个数
        //bucketElmentCounts[0]记录的就是 bucket[0]每次放入的数据个数
        int[] bucketElmentCounts = new int[10];


        //这里使用循环
        for (int t = 0,n=1; t < maxLength; t++,n=n*10) {

            //针对每个元素对应的位进行排序,第一次是各位,第二次是十位,第三次是百位
            for (int j = 0; j < arr.length; j++) {
                //取出每个元素的个数
                int digitOfElement = arr[j]/n % 10;
                //放入到对应的桶中
                bucket[digitOfElement][bucketElmentCounts[digitOfElement]] = arr[j];
                bucketElmentCounts[digitOfElement]++;
            }
            int count = 0;
            //将桶中的元素依次取出,并将桶中的数据放入原来的数组
            for (int i = 0; i < bucket.length; i++) {
                for (int j = 0; j < bucketElmentCounts[i]; j++) {
                    arr[count] = bucket[i][j];
                    count++;
                }
                bucketElmentCounts[i] = 0;
            }

            System.out.println("桶排序第+"+(t+1)+"轮的结果为" + Arrays.toString(arr));
        }

    }


}

性能分析

排序前的时间是2020-01-04 19:38:15
排序后的时间是2020-01-04 19:38:15

数据结构整理目录

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!