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("

");

}


本文已閱讀完畢,歡迎發表書評!

感謝D吐泡泡R上傳分享本文,訪問用戶主頁