#include <iostream>
void Swap(int &a,int &b){
int temp;
temp = a;
a = b;
b = temp;
}
// 維護最小堆
void AdjustMinHeap(int *a,int pos,int len){
int temp,child;
for (temp = a[pos];2*pos +1 <= len; pos = child) { //不斷下移父結點,直到結束
// 左孩子(因爲第一個結點是從0開始的)
child = 2*pos +1;
if (child < len && a[child] > a[child +1])// 選取左右孩子中的最小值,a[pos]=temp父親,a[child]左孩子,a[child+1]右孩子
child++;
if (temp > a[child]) { //如果父結點>最小值,將將父節點賦予最小值
a[pos] = a[child];
} else {
break;
}
}
a[pos] = temp;
}
/* 堆排序
基本思想:對於n個元素的序列進行堆排序,先將其建成堆(最小堆:上一層的比本層小,一次遞推)。以根結點與第n個結點交換,調整前n-1個結點成爲堆,再以根節點與第n-1個結點進行交換,重複上述操作,直到整個序列有序。
特點:時間複雜度:O(nlogn)
*/
void MyMinHeapSort(int *array,int len){
int i;
for (i = len/2-1; i >=0;i--) //先初建堆
AdjustMinHeap(array, i, len -1);
for (i = len -1; i >=0; i--) {
Swap(array[i],array[0]); //取出堆頂元素(也就是最小元素array[0],放到數組第i位)
AdjustMinHeap(array,0, i-1); //然後對前i-1位數組重建堆(重建後堆頂爲最小元素)
}
}
int main(int argc,constchar * argv[])
{
int i;
int array[] = {0,13,1,14,27,18};
int length =sizeof(array)/sizeof(array[0]);
// 堆排序
MyMinHeapSort(array, length);
for (i =0; i < length; i++){
printf("%d ",array[i]);
}
printf("\n");
return0;
}