八大排序---基数排序(桶排序)

一.堆排序的步骤

第一步:找出数组之中最大的数
第二步:获取最大的数的位数
第三步:将数字分配到各自的桶中,然后按照桶的顺序输出排序结果
第四步:循环第三步i次,i为最大数的位数

二.图解

假设现在我们要对这样一组数进行基数排序;
我们首先要找到这组数中的最大数(遍历数组),这里很明显最大的数为5678;
找出最大数的位数为四位,因此我们需要对这组数据进行四轮排序;
第一轮排序:我们从最低位(个位)开始排序:
遍历数组根据数的个位将每个数放入各个桶中,先进入桶中的数,在桶中的位置越靠下
接下来我们将桶中的数按桶的顺序倒出,一个桶中有多个数字的时候先倒出最靠下的数字(先进先出)

第一轮排序完成,我们还需要再进行三轮排序(最大的数位数有多少,我们就需要排多少次)
第二次我们需要从十位开始进行排序了:

同上面一样,我们将元素放入桶中之后再倒出来

这样,我们就完成了对十位的排序,后面我们继续对百位和千位进行排序即可(排序到千位是因为我们数组之中最大的数字为四位数)

三.代码实现

首先我们需要先找到数组之中最大的数字,这样我们才能根据最大数的位数确定后面排序的次数

public static int findmax(int[] arr){
    //这里我们返回最大数的位数
    int max=0;
	for(int i=0;i<arr.length;i++) {
		if(max<arr[i])max=arr[i];
	}

	int maxlength=0;
	for(;max!=0;max/=10) {
		maxlength++;
	}
    
    return maxlength;
}

这里我们需要创建一个桶,桶中需要存储十个数组,每个数组的最大长度与我们的待排序数组长度相同,但是这里我们有一个问题,我们怎么来记录我们在一个桶中放入一个元素,这个元素该放在对应桶中的位置呢?我们引入了一个桶计数器,桶计数器为一个一位数组,长度为10,用来记录每个桶中存储了元素的个数。

以下为桶排序的完整代码:

import java.util.Arrays;
public class Bucket_sort {
	public static void main(String[] args) {
		int[] arr= {5,84,925,75,2549,248,51,6,745,12,369,777};
		bucketsort(arr);
	}
	public static void bucketsort(int[] arr) {
		int maxlength=findmax(arr);
		for(int count=0;count<maxlength;count++) {
			int[][] bucket=new int[10][arr.length];
			int[] bucketelement=new int[10];

			for(int i=0;i<arr.length;i++) {
				int element=arr[i];
				for(int j=0;j<count;j++) {
					element/=10;
				}
				element=element%10;

				bucket[element][bucketelement[element]]=arr[i];
				bucketelement[element]++;
			}

			int k=0;
			for(int j=0;j<10;j++) {
				for(int bcount=0;bcount<bucketelement[j];bcount++) {
					arr[k]=bucket[j][bcount];
					k++;
				}
			}
			//System.out.printf("第%d轮排序之后结果为:",count+1);
			//System.out.println(Arrays.toString(arr));
			
		}
		}
	public static int findmax(int[] arr){
	    //这里我们返回最大数的位数
	    int max=0;
		for(int i=0;i<arr.length;i++) {
			if(max<arr[i])max=arr[i];
		}

		int maxlength=0;
		for(;max!=0;max/=10) {
			maxlength++;
		}
	    
	    return maxlength;
	}
}
 

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值