6-7基数排序

基数排序


基本介绍

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

  2. 基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法

  3. 基数排序(Radix Sort)是桶排序的扩展

基本思想

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

图解

1621157310321

1621157600192

1621157677391

代码实现

package com.company.sort;

import java.lang.reflect.Array;
import java.util.Arrays;

/**
 * @Function :
 * date 2021/5/16 - 17:40
 * How :
 */
public class RadixSort {
    public static void main(String[] args) {
        int [] arr = { 53, 3, 542, 748, 14, 214};
        ridixSort(arr);
    }

    public static void ridixSort(int[] arr){
        //获取最大的数
        int max = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (max<arr[i]){
                max = arr[i];
            }
        }
        int maxLenght = String.valueOf(max).length();

        for (int k = 0, n=1; k < maxLenght; k++,n*=10) {


            //第一轮 只对每一个元素各位进行排序
            //第一一个二维数组 包含十个筒 每个桶就是一维数组
            int[][] bucket = new int[10][arr.length];
            int[] bucketElementCounts = new int[10];
            for (int i = 0; i < arr.length; i++) {
                int digitOfElement = arr[i]/n%10;
                //放入桶中
                bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[i];
                bucketElementCounts[digitOfElement]+=1;
            }
            //从桶中取出元素
            int index = 0;
            for (int i = 0; i < bucketElementCounts.length; i++) {
                if (bucketElementCounts[i] != 0){
                    for (int j = 0; j < bucketElementCounts[i]; j++) {
                        arr[index] = bucket[i][j];
                        index++;
                    }
                }
            }
            System.out.println(Arrays.toString(arr));

        }

    }
}

注意

稳定排序

速度快

数据量大时耗费内存大

posted @ 2021-11-23 21:14  剪水行舟  阅读(59)  评论(0)    收藏  举报