void sift(RECNODE *r, int i, int m)
{/*i是根結點編號,m是以i結點為根的子樹中最後一個結點的編號*/
int j;
RECNODE temp;
temp = r[i];
j = 2 * i; /*j為i根結點的左孩子*/
while(j <= m)
{if(j < m && (r[j].key < r[j 1].key))
j ; /*當i結點有左右孩子時,j取關鍵字大的孩子結點編號*/
if(temp.key < r[j].key)
{ r[i] = r[j]; i = j; j = 2 * i;}/*按堆定義調整,並向下一層篩選調整*/
else break; /*篩選調整完成,跳出循環*/
}
r[i] = temp;}
void heapsort(RECNODE *r, int n)
{/*堆排序: n為r表中記錄數,從r[1]開始放起*/
int i;
RECNODE temp;
for(i = n/2; i >= 1; i--)
sift(r, i, n); /*將無序序列建成大堆*/
for(i = n; i >= 2; i--)
{temp = r[1]; /*堆頂及堆尾元素交換*/
r[1] = r[i];
r[i] = temp;
sift(r,1,i - 1); /*交換後,從第一個元素開始調整為大堆,每次記錄個數少一個*/
} }
main( )
{ RECNODE a[MAXSIZE];
int i, j, k, len;↑思↑兔↑在↑線↑閱↑讀↑
printf("
輸入待排序數據(整數,以空格隔開,0 結束) : "); k = 0; scanf("%d",&j);
while(j != 0) { k ; a[k].key = j; scanf("%d",&j); }
len = k;
printf("
排序前 : ");
for (i = 0; i < len; i ) printf(" %d",a[i 1].key);
printf("
");
heapsort (a,len);
printf("
排序後 : ");
for (i = 0; i < len; i ) printf(" %d",a[i 1].key);
printf("
");
}
本文已閱讀完畢,歡迎發表書評!