直接貼源代碼:
package com.java.fmd;
import java.util.Scanner;
public class HeapSort {
int[] arr;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n=0;
System.out.println("請輸入長度:");
n=sc.nextInt();
HeapSort heapSor = new HeapSort();
int[] arr = new int[n+1]; //0下标放的是數組長度,
arr[0]=n;
System.out.println("請輸入相應個數的數字:");
for(int i=1;i<=n;i++) {
arr[i]=sc.nextInt();
}
heapSor.arr = arr;
heapSor.heapSort(arr);
System.out.println("排序結果為:");
for(int i=1;i<arr.length;i++)
System.out.print(arr[i]+" ");
}
void heapAdjust(int[] arr,int s,int m){
//已知arr[s...m]中記錄的關鍵字除arr[s]之外均滿足堆的定義,本函數調整arr[s]的關鍵字,使arr[s...m]成為一個最大堆
int rc = arr[s]; //s是最後一個非葉子節點
for(int j=2*s;j <= m;j = s*2){
if(j<m && arr[j]<arr[j+1])
j++; //j為key較大的下标
if(rc >= arr[j]) break;
arr[s] = arr[j]; //上移到父節點
s=j;
}
arr[s]=rc; //要放入的位置
}
void heapSort(int[] arr){
//對數組進行建堆操作,就是從最後一個非葉結點進行篩選的過程
for(int i=(arr.length-1)/2;i > 0;i--){//因為0沒有使用,是以length-1
heapAdjust(arr,i,arr.length-1);
}
outputArr(1);
for(int i=arr.length-1; i>1; i--){
int temp = arr[1];
arr[1] = arr[i];
arr[i] = temp;
heapAdjust(arr,1,i-1);
}
}
void outputArr(int i){
if(i <= arr[0]){
//System.out.println(arr[i]);
outputArr(i*2); //左
outputArr(i*2+1); //右
}
}
}
結果截圖: