桶排序
将元素放入一个桶中,求元素其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;
}
}
}