排序算法——桶排序

排序算法——桶排序

桶排序的工作原理是将数组分到有限数量的桶里,每个桶再分别排序。桶排序利用函数的映射关系,减少了几乎所有的比较工作。实际上,桶排序的(arr[i]-min)/(arr.length)值的计算,其作用就相当于快排中划分,已经把大量数据分割成了基本有序的数据块(桶)。然后只需要对桶中的少量数据做比较排序即可。

例如一组数组{99,88,77,66,55,44,33,22,11},先计算出桶数(max-min)/arr.length+1=(99-11)/9+1≈10.778,截取整数部分(不进行四舍五入),得出共有10个桶;再将数组的每个数放到第(int)(arr[i]-min)/(arr.length)-1个桶中,例如:99放到第(int)(99-11)/9+1=10个桶,88放到第(int)(88-11)/9+1=9个桶,77放到第(int)(77-11)/9+1=8个桶,以此类推;此时分别有10个桶分别为[11]、[22]、[33]、[44]、[55]、[]、[66]、[77]、[88]和[99],最后对每个桶的数据排序得到{11,22,33,44,55,66,77,88,99}。

Java代码实现:

注:需导入java.util中的ArrayList、Collections。

import java.util.ArrayList;
import java.util.Collections;
public static void main(String[] args) {
	int[] arr = {99,88,77,66,55,44,33,22,11}; 
	bucketSort(arr);//桶排序
}
public static void bucketSort(int[] arr)//桶排序
{
	int max = Integer.MIN_VALUE;//int最小值:-2^31=-2147483648
	int min = Integer.MAX_VALUE;//int最大值:(2^31)-1=2147483647
	for(int i = 0; i < arr.length; i++){
		max = Math.max(max, arr[i]);//取数组最大值
		min = Math.min(min, arr[i]);//取数组最小值
	}
	int bucketNum = (max - min) / arr.length + 1;//桶数
	ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>	(bucketNum);
	for(int i = 0; i < bucketNum; i++){
		bucketArr.add(new ArrayList<Integer>());
	}
	//将每个元素放入桶
	for(int i = 0; i < arr.length; i++){
		int num = (arr[i] - min) / (arr.length);
		bucketArr.get(num).add(arr[i]);
	}
	System.out.println("共"+bucketArr.size()+"个桶:"+bucketArr.toString());
	//对每个桶进行排序
	for(int i = 0; i < bucketArr.size(); i++){
		Collections.sort(bucketArr.get(i));
	}
	System.out.println("已排序的桶:"+bucketArr.toString());
	ArrayList <Integer> a = new ArrayList<Integer>();//用作存放每个桶的元素
	for (ArrayList<Integer> arrayList : bucketArr) {
		for (int i : arrayList) {
			a.add(i);//所有桶的元素依次放入集合中
		}
	}
	for (int i = 0; i < a.size(); i++) {
		arr[i]=a.get(i);//a集合的元素依次赋给原数组
	}
	System.out.print("桶排序结果:");
	for (int l : arr) {
		System.out.print(l+",");
	}
}
执行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新鑫S

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值