#include #include int left(int i)//返回左孩子位置
int right(int i)//返回右孩子位置
void min_heapify(int *a,int heap_size,int i)//保持堆性質,使以i為根的子樹成為最小堆 ,heap_size當前堆中元素數量
void heap_sort2(int *a,int length)//堆排序,從大到小 ,length為堆中元素數量
}int main(int argc, char *argv)
;//測試資料
//int length=10;
int length;//陣列中的堆的資料的長度
int a[100];
a[0]=0;
int i;
printf("請輸入元素的數量:");
scanf("%d",&length);
printf("\n請依次輸入%d個元素,空格結束:\n",length);
for(i=1;i<=length;i++)
scanf("%d",&a[i]);
printf("\n");
for(i=1;i<=length;i++)
printf("%d ",a[i]);
printf("\n------------------------\n");
printf("建立最小堆以後\n");
build_min_heap(a,length);
for(i=1;i<=length;i++)
printf("%d ",a[i]);
printf("\n");
printf("使用堆排序後:\n");
heap_sort2(a,length);
for(i=1;i<=length;i++)
printf("%d ",a[i]);
system("pause");
return 0;
}
最小堆的建立及堆排序
堆的建立 堆在很多方面都有運用,這裡寫一下將乙個完全二叉樹用一維陣列儲存後再轉化為乙個最小堆 如下 假如樹中的資料都為整數 include int a 50 int n void swap int p,int q void siftdown int i if t i else flag 1 父結點小...
排序入門練習題2 從大到小排序 題解
題目出處 資訊學奧賽一本通 例2.1 題目描述 輸入 n 個數,將 n 個數按從大到小的順序輸出 n le 10000 輸入格式 輸入的第一行包含乙個整數 n le 10000 用於表示元素個數。接下來一行包含 n 個int範圍內的整數。輸出格式 輸出佔一行,用於表示 n 個整數從小到大排的結果,兩...
一步一步解析java排序演算法 堆排序(最小堆)
首先明確什麼是堆?乙個陣列 int unsort 堆的表現形式 這是乙個最小堆,根節點是最小的 用陣列來表示堆,i結點的父結點下標就為 i 1 2。它的左右子結點下標分別為2 i 1和2 i 2。這樣就是給數組建好堆了 下面進入堆排序的核心步驟 堆節點的移動 這裡需要對unsort 3 12進行調整...