利用大頂堆(小頂堆)的根節點記錄最大數值(最小數值)的特性,可以對數值進行排序
現以大頂堆的基本思想爲例:
1、將int 數組arr[1,…,n]構造爲大頂堆,實現函數爲heapadjust();
2、可得大頂堆的根節點,即arr[1]的數值爲最大數值,然後將該值與arr[n]互換。
3、對數組arr[1,…,n-1]構造爲大頂堆並將arr[1]與arr[n-1]互換,直到n-1爲2停止互換,堆排序完成。
對於堆排序,最重要的兩個操作就是構造大頂堆和調整堆,其實構造初始堆事實上也是調整堆的過程。
實現代碼:
#include <stdio.h>
#include <stdlib.h>
//對當前節點進行調整,這樣得到一個大頂堆
void heapadjust(int k[],int n)
{
int i,temp=0;
for(i=n/2;i>0;i--)
{
if(k[i]<k[2*i+1] && (2*i+1)<=n)
{
temp = k[i];
k[i] = k[2*i+1];
k[2*i+1] = temp;
}
if(k[i]<k[2*i] && 2*i<=n)
{
temp = k[i];
k[i] = k[2*i];
k[2*i] = temp;
}
}
}
//將堆排序後數組的根節點和最後一個節點的值互換
void swap(int k[],int i,int j)
{
int temp = k[i];
k[i] = k[j];
k[j] = temp;
}
//堆排序
void heapsort(int k[], int n)
{
int i =n/2;
heapadjust(k,n);
//將本次根節點的數值和最後的葉子節點互換,然後排序的數據減1,找到減一後的最大數值,再和倒數第二個節點互換
for(i=n;i>=1;i--)
{
swap(k,1,i);
heapadjust(k,i-1);
}
}
int main()
{
//堆排序,採用二叉樹結構,所以下標從1開始
int arr[10]={-1,45,68,29,10,95,978,2,3,9};
heapsort(arr,9);
int i=0;
printf("排序後的結果是:\n");
for(i=1;i<10;i++)
{
printf("%d\t",arr[i]);
}
return 0;
}
結果: