桶排序

桶排序

将元素放入一个桶中,求元素其hash值,hash=e*length/(max+1),用hash作为下标即在桶中的位置,由于会出现元素hash值相同的情况,此时桶中使用链表的方式存储元素。之后每次放入元素都使用插入排序的方式进行排序。代码如下:

public class BucketSort{
	private int hash(int element,int max,int length){return element*length/max+1;}//求下标
	private int maxOf(int[]arr){//求最大值
			int max=0;
			for(int i=0;i<arr.length;i++){
				if(max<arr[i])max=arr[i];
				else continue;
		}
		return max;
}
public static void main(String[] args) {//测试
		int[]arr= {5,6,3,4,50,22,36,5,7,9,2};
		System.out.println("begin...arr="+Arrays.toString(arr));
		new BucketSort().sort(arr);
		System.out.println("final...arr="+Arrays.toString(arr));		
	}
private void sort(int[]arr){
	int length=arr.length;//桶的个数
	LinkedNode[]bucket=new LinkedNode[length];
	int max=maxOf(arr);
	for(int i=0;i<length;i++){
		int value=arr[i];
		int hash=hash(arr[i],max,length);
		if(bucket[hash]==null){
			bucket[hash]=new LinkedNode(value);//初始化桶
		}else{
			insertInto(value,bucket[hash],bucket,hash);//插入链表
		}
}
//出桶
	int k=0;//记录数组下标
	for(for LinkedNode node:bucket){
		if(node!=null){
			while(node!=null){
				arr[k++]=node.value;
				node=node.next;
			}	
	}
}
}
private void insertInto(int value,LinkedNode head,LinkedNode[]bucket,int hash){
	LinkedNode newNode=new LinkedNode(value);
	//小于头节点,放在头上
	if(value<=head.value){
		newNode.next=head;
		bucket[hash]=newNode;//替换头节点
		return;
}
	LinkedNode p=head;
	LinkedNode pre=p;
	while(p!=null&&value>p.value){
		pre=p;
		p=p.nex;
}
	if(p==null){//跑到末尾
		pre.next=newNode;
}else{//插入pre和p之间
	pre.next=newNode;
	newNode.next=p;
}
private static class LinkedNode{
	private int value;
	private LinkedNode next;
	public LinkedNode(int value){
		this.value=value;
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鹏之翼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值