您的位置:首页 > 编程语言 > Java开发

heapSort_by_Java

2013-06-19 00:40 344 查看
用java 实现的堆排序(heapSort)没有进行防御性编程,仅供实现参考。

说明:由于是对数组进行原地排序,而且对于堆中的非叶子节点a来说,其左孩子的编号为2*a,右孩子的编号为2*a+1,因此对于数组中第0号元素上述公式不在适用,为了方便起见,我将第0号元素设置为-1,仅作为占位符使用,实际排序中不对其进行处理。

public class Heap_Sort {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a={-1,3,5,8,9,6,4,32,21,1};
Heap_Sort hs=new Heap_Sort();
hs.BuildHeap(a);
int len=a.length;
for(int i=1;i<a.length;i++){
len--;
int t=a[1];
a[1]=a[len];
a[len]=t;
hs.Modify(a,1,len);
}
for(int i=a.length-1;i>0;i--){
System.out.println(a[i]);
}
}
private int[] BuildHeap(int[] a){
if(a==null){
return null;
}else{
for(int i=(a.length-2)/2;i>0;i--){ //由于堆默认为完全二叉树,因此(a.length-2)/2即为数据a中最后一个非叶子结点;
Modify(a,i,a.length);
}

}
return a;
}

private void Modify(int[]a,int i,int len){

int left=2*i;
int right=2*i+1;
if(left<len&right<len){
if((a[left]<a[i])&(a[left]<a[right])){
int t=a[i];
a[i]=a[left];
a[left]=t;
Modify(a,left,len);

}else if((a[i]>a[right])&(a[left]>a[right])){
int t=a[i];
a[i]=a[right];
a[right]=t;
Modify(a,right,len);

}
}else if(left<len){
if(a[i]>a[left]){
int t=a[i];
a[i]=a[left];
a[left]=t;
}
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java heap 编程