参考算法导论伪代码所写
public class Heap {
// 保持最大堆的性质
private static void max_heapify(int[] datas,int i,int heap_length){
int l = 2*i+1;
int r = 2*i+2;
int largest = 0;
if(l<heap_length && (datas[l]>datas[i])){
largest = l;
} else {
largest = i;
}
if(r<heap_length && (datas[r]>datas[largest])){
largest = r;
}
//System.out.println("(left:)"+l+"(right:)"+r+"(largest:)"+largest+"(i:)"+i);
if(largest!=i){
int temp = datas[i];
datas[i] = datas[largest];
datas[largest] = temp;
max_heapify(datas,largest,heap_length);
}
}
// 保持最小堆的性质
private static void min_heapify(int[] datas,int i,int heap_length){
int l = 2*i+1;
int r = 2*i+2;
int largest = 0;
if(l<heap_length && (datas[l]<datas[i])){
largest = l;
} else {
largest = i;
}
if(r<heap_length && (datas[r]<datas[largest])){
largest = r;
}
//System.out.println("(left:)"+l+"(right:)"+r+"(largest:)"+largest+"(i:)"+i);
if(largest!=i){
int temp = datas[i];
datas[i] = datas[largest];
datas[largest] = temp;
min_heapify(datas,largest,heap_length);
}
}
// 构造最大堆
private static void buildMax_heap(int[] datas){
int length = datas.length/2;
for(int i=length;i>=0;i--){
max_heapify(datas,i,datas.length);
}
}
// 构造最小堆
private static void buildMin_heap(int[] datas){
int length = datas.length/2;
for(int i=length;i>=0;i--){
min_heapify(datas,i,datas.length);
}
}
// 最大堆排序
private static void heapsort_max(int[] datas){
buildMax_heap(datas);
int heap_length = datas.length;
for(int i=heap_length-1;i>=0;i--){
int max_value = datas[0];
datas[0] = datas[i];
datas[i] = max_value;
System.out.println(max_value);
max_heapify(datas, 0, i);
}
}
// 最小堆排序
private static void heapsort_min(int[] datas){
buildMin_heap(datas);
int heap_length = datas.length;
for(int i=heap_length-1;i>=0;i--){
int max_value = datas[0];
datas[0] = datas[i];
datas[i] = max_value;
System.out.println(max_value);
min_heapify(datas, 0, i);
}
}
public static void main(String[] args){
int[] datas={8,4,3,6,5,7,9,10,1,2,8,12};
heapsort_max(datas);
System.out.println("=======================");
heapsort_min(datas);
}
}
这本书 真是读起来 非常有趣.