排序算法之基数排序

基数排序(桶排序)基本介绍

  • 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort),它是通过键值各个位的值,将要排序的元素分配至“某些桶中”,达到排序的目的

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

  • 基数排序是桶排序的扩展

  • 基数排序是188年赫尔曼.何乐礼发明的,实现思路:将整数按位数切割成不同的数字,然后按每个位数进行比较

基数排序的基本思想

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

  2.  

     

代码:

package com.gcy.sort;

import java.util.Arrays;

/**
* 基数排序
* @author Administrator
*
*/
public class RadixSort {

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

}
/**
* 基数排序
* @param arr
*/
public static void radixSort(int[] arr) {
//定义一个二维数组,表示10个桶每个桶就是一个一维数组
int [][]bucket=new int[10][arr.length];
//为了记录每个桶中,实际存放了多少数据,定义一个一维数组来记录各个桶的每次存放数据的个数
//bucketCounts[0]记录的是第一个桶中存放的数据个数
int [] bucketCounts=new int[10];
//最终代码
//.得到数组中最大数的位数,依次来判断它需要通过几轮排序
int max=arr[0];//假定数组中的第一个就是最大的
for(int i=1;i<arr.length;i++) {
if(max<arr[i]) {
max=arr[i];
}
}
//判断最大数是几位数
int maxLength=(max+"").length();

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][bucketCounts[digitOfElement]]=arr[j];
bucketCounts[digitOfElement]++;
}
//按照桶的顺序(一维数组的下标依次取出数据,放到原来的数组中)
int index=0;
//遍历每一个桶,并将桶中的数据放入到arr[]中
for(int k=0;k<bucketCounts.length;k++) {
//如果桶中有数据,就喜爱那个数据取出
if(bucketCounts[k]!=0) {
//循环该桶,即第k个桶
for(int l=0;l<bucketCounts[k];l++) {
//取出元素,放入到arr[]中
arr[index]=bucket[k][l];
index++;
}
}
bucketCounts[k]=0;
}
System.out.println("第"+(i+1)+"轮arr="+Arrays.toString(arr));
}








/*//定义一个二维数组,表示10个桶每个桶就是一个一维数组
int [][]bucket=new int[10][arr.length];

//为了记录每个桶中,实际存放了多少数据,定义一个一维数组来记录各个桶的每次存放数据的个数
//bucketCounts[0]记录的是第一个桶中存放的数据个数
int [] bucketCounts=new int[10];
//第一轮排序(针对每个元素的个位进行排序处理)
for(int j=0;j<arr.length;j++) {
//取出每个元素的个位数
int digitOfElement=arr[j]%10;
//放入到对应的桶中
bucket[digitOfElement][bucketCounts[digitOfElement]]=arr[j];
bucketCounts[digitOfElement]++;
}
//按照桶的顺序(一维数组的下标依次取出数据,放到原来的数组中)
int index=0;
//遍历每一个桶,并将桶中的数据放入到arr[]中
for(int k=0;k<bucketCounts.length;k++) {
//如果桶中有数据,就喜爱那个数据取出
if(bucketCounts[k]!=0) {
//循环该桶,即第k个桶
for(int l=0;l<bucketCounts[k];l++) {
//取出元素,放入到arr[]中
arr[index]=bucket[k][l];
index++;
}
}
}
System.out.println(Arrays.toString(arr));*/
}

}

截图:

 

有兴趣的,可以尝试写一下,第二轮,第三轮的代码,其实和第一轮非常相似,只需要修改其中很少的东西就可以了

常用排序算法的总结和对比

 

posted @ 2020-10-06 23:23  IT特工  阅读(180)  评论(0编辑  收藏  举报