public classMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
int test[] ={0,-1,78,22,45,-100};
HeapSort(test);
for(int i = 0;i<test.length;i++){
System.out.println(test[i]);
}
}
public static void HeapSort(int values[]){
for( int i = values.length/2 -1;i>=0;i--){
MinHeapFiexDown(values,i,values.length);
}
for( int i = values.length -1 ;i >=1 ;i--){
Swap(values,i,0);
MinHeapFiexDown(values,0,i);
}
}
// 從i節點開始調整,n爲節點總數,從0開始計算i節點的子節點爲:2*i+1,2*i+2
@SuppressWarnings("unused")
private static void MinHeapFiexDown(int a[],int i,int n){
int j,temp;
temp = a[i];
j = 2*i+1;
while(j < n){
// 在左右孩子中獲取最小的
if(j + 1 < n && a[j + 1] < a[j]) j++;
if(a[j] >= temp) break;
a[i] = a[j];
i = j;
j = 2 * i + 1;
}
a[i] = temp;
}
@SuppressWarnings("unused")
private static void Swap(int values[],int aIdx,int bIdx){
int temp = values[aIdx];
values[aIdx] = values[bIdx];
values[bIdx] = temp;
}
}
//輸出結果:
78
45
22
0
-1
-100