排序算法--基数排序

基数排序(桶排序)的介绍:

       1)基数排序(radix sort)属于“分配式排序" (distribution sort) ,又称“桶子法” (bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用
       2)基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法
       3)基数排序(Radix Sort)是桶排序的扩展
       4)基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。

       基数排序的基本思想:

              1)将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
              2)这样说明,比较难理解,下面我们看一个图文解释,理解基数排序的步骤

排序算法--基数排序_第1张图片

       代码实现:(排序及排序测速)

package com.alibaba.sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class RadixSort {
    public static void main(String[] args) {
       // int[] arr={53,3,542,748,14,214};
        int[] arr=new int[8000000];
        for (int i = 0; i <8000000; i++) {
            arr[i]=(int)(Math.random()*8000000);//生成一个[0,8000000)的数
        }
        Date date1=new Date();
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date1Str=simpleDateFormat.format(date1);
        System.out.println("排序前的时间为:"+date1Str);
        radixSort(arr);
        Date date2=new Date();
        String date2Str=simpleDateFormat.format(date2);
        System.out.println("排序后的时间为:"+date2Str);
    }
    //排序方法
    public  static void radixSort(int[] arr){
        int max=arr[0];
        for (int i = 0; i < arr.length; i++) {
            if(arr[i]>max){
                max=arr[i];
            }
        }
        int maxLength=(max+"").length();
        //为防止放入数时,数据溢出,则每个一维数组(桶),大小定义为arr.length
        int[][] bucket=new int[10][arr.length];
        //为记录每个桶中,实际放了多少个数据,我们定义一个一维数组来记录各个桶的每次放入的数据个数
        //例如:bucketElementCounts[0],记录的jiu'shi就是bucket[0]桶的放入的数据
        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]++;
            }
            //按照这个桶的顺序(一维数组的下标依次取出数据,放入原来的数组)
            int index=0;
            //遍历每个桶,将同种的数据放入原数组
            for (int k = 0; k 

 

你可能感兴趣的:(数据结构和算法,算法,排序算法,数据结构,基数排序)