这是我自己动手编写的一个堆算法,通过这个算法的实现,这让我更加理解了
关于堆的一些问题。
package classes;
import java.util.*;
public class TestHeap{
public static void createHeap(int first, int end, int[] a){
int finish;
int i,j;
int root;
//if(first==end) return;
//first--end 区间的最后一个非叶子结点为(end-first+1)/2+first-1;
for( i=(end-first+1)/2+first-1; i>=first; i--){
finish=0;
root=a[i];
//first--end 区间的i结点的子结点的位置在2*(i-first+1)+first-1
j=2*(i-first+1)+first-1;
while(finish==0&&j<=end){
//找到最小子节点
if(j<end)
if(a[j+1]<a[j])j++;
//判断堆是否构造完成,否则构造堆
if(root<=a[j]){
finish=1;
}else{
a[i]=a[j];
i=j;j=2*(i-first+1)+first-1;
}//end if-else
}//end while
a[i]=root;
}//end for
}//end method createHeap
public static void heapSort(int [] a){
for(int i=0; i<a.length; i++){
createHeap(i,a.length-1,a);
System.out.println(Arrays.toString(a));
}//end for
}//end method heapSort
public static void main(String[] args){
int [] array = new int[15];
for(int i=0; i<array.length; i++)
array[i] = (int)(Math.random()*100);
System.out.println(Arrays.toString(array));
heapSort(array);
//for(int i=0;i<array.length;i++)
// System.out.printf("%3s",array[i]);
//System.out.println();
System.out.println(Arrays.toString(array));
}//end method main
}//end class TestHeap