Java堆排序算法

来源:互联网 发布:如何制作淘宝宝贝长图 编辑:程序博客网 时间:2024/06/14 12:53

package Practice;

//堆排序算法
public class smartheapsort {


public static void main(String[] args) {

int[] a={5,7,2,6,8,9,3,1,4};
System.out.println("刚开始的元素!!!");
for (int j = 0; j < a.length; j++) {
System.out.print(a[j]);
}
System.out.println();
System.out.println("堆排序之后");
int n=a.length;
//从(n-1)/2开始,往i=0比较
for (int i = (n-1)/2; i >=0; i--) 
//建立初始堆
HeapSort(a,n,i);
//输出堆排序之后的值
PrintHeap(a);
//从堆顶开始删除元素
delete(a);
}


public static void HeapSort(int [] a,int n,int k ){

int temp=0;
int k1=2*k+1;//左子树的节点
int k2=2*k+2;//右子树的节点
if(k1>a.length&&k2>a.length)//如果左右子树的节点都大于a.length,则结束
return;
int a1=Integer.MAX_VALUE;//定义两个变量,来保存左右子树
int a2=Integer.MAX_VALUE;
if(k1<n) a1=a[k1];//a1和a2分别代表左右字树的值
if(k2<n) a2=a[k2];

if(a[k]<a1&&a[k]<a2)//如果当前节点的值比它的子树节点的值都小,即堆排序成功,return到HeapSort(a,n,i);
return;
//如果存在子节点的值比父节点的值小,则交换
if(a1<a2){
temp=a[k];
a[k]=a[k1];
a[k1]=temp;
HeapSort(a,n,k1);//这里继续调用HeapSort方法是为了避免堆中交换元素后,堆中局部元素不满足小根堆的要求
}
else{
temp=a[k];
a[k]=a[k2];
a[k2]=temp;
HeapSort(a,n,k2);//这里继续调用HeapSort方法是为了避免堆中交换元素后,堆中局部元素不满足小根堆的要求
}
}

public static void PrintHeap(int[] a){
for (int s = 0; s < a.length; s++) {
System.out.print(a[s]);
}
System.out.println();
}
public static void delete(int[] a){
System.out.println("删除堆顶元素!!!");
int n=a.length;
while(n>0){
System.out.print(a[0]);//输出堆顶元素
a[0]=a[n-1];//最后一个元素移动到堆顶
n--;
HeapSort(a,n,0);
}
}
}