桶式排序(java实现)

数据包装类:

package sorted;

public class DataWrap implements Comparable<DataWrap>{
	int data;
	String flag;
	public DataWrap(int data,String flag){
		this.data=data;
		this.flag=flag;
	}
	public String toString(){
		return data+"_"+flag;
	}
	public int compareTo(DataWrap dw){
		return this.data>dw.data ? 1:(this.data==dw.data? 0 : -1);
	}
}

桶式排序算法如下:

package sorted;

import java.util.Arrays;

/**
 *	时间效率高 
 *	空间开销大
 *	稳定的算法
 */ 
public class BucketSort {
	public static void bucketSort(DataWrap[] data,int min,int max){
		System.out.println("开始排序:");
		//arrayLength记录待排序数组的长度
		int arrayLength =data.length;
		DataWrap[] tmp=new DataWrap[arrayLength];
		//buckets数组相当于定义了max-min个桶
		//buckets数组用于记录待排序元素的信息
		int[] buckets=new int[max-min];
		//计算每个元素在序列中出现的次数
		for(int i=0;i<arrayLength;i++){
			//buckets数组记录了DataWrap出现的次数
			buckets[data[i].data-min]++;
		}
		System.out.println(Arrays.toString(buckets));
		//计算落入各桶内的元素在有序序列中的位置
		for(int i=1;i<max-min;i++){
			//前一个bucket的值+当前bucket的值->当前bucket新的值
			buckets[i]=buckets[i]+buckets[i-1];
		}
		System.out.println(Arrays.toString(buckets));
		System.arraycopy(data, 0, tmp, 0, arrayLength);
		//根据buckets数组中的信息将待排序列的各元素放入相应的位置
		for(int k=arrayLength-1;k>=0;k--){
			data[--buckets[tmp[k].data-min]]=tmp[k];
		}
	}
	
	public static void main(String[] args){
		DataWrap[] data={
			new DataWrap(9,""),
			new DataWrap(5,""),
			new DataWrap(-1,""),
			new DataWrap(8,""),
			new DataWrap(5,"*"),
			new DataWrap(7,""),
			new DataWrap(3,""),
			new DataWrap(-3,""),
			new DataWrap(1,""),
			new DataWrap(3,"*")
		};
		System.out.println("排序之前:\n"+Arrays.toString(data));
		bucketSort(data,-3,10);
		System.out.println("排序之后:\n"+Arrays.toString(data));
	}
	
}

运行结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值