#include <stdio.h>
int h[101];//用來存放堆的數組
int n;//用來存儲堆中元素的個數,也就是堆的大小
//交換函數,用來交換堆中兩個元素的數值
void swap(int x, int y)
{
int t;
t = h[x];
h[x] = h[y];
h[y] = t;
}
//向下調整函數
void siftdown(int i)
{
int t, flag = 0;
while (i*2 <= n && flag == 0)
{
if(h[i] < h[i * 2])
t = i * 2;
else
t = i;
if (i * 2 + 1 <= n)
{
if (h[t] < h[i*2+1])
t = 2*i + 1;
}
if (t != i)
{
swap(t, i);
i = t;
}
else
flag = 1;
}
}
//建立堆函數
void creat()
{
int i;
for (i = n/2; i >= 1; i--)
siftdown(i);
}
//堆排序
void heapsort()
{
while(n>1)
{
swap(1, n);
n--;
siftdown(1);
}
}
int main()
{
int i, num;
printf("輸入數據的個數:");
scanf("%d", &num);
printf("輸入數據:\n");
for (i = 1; i <= num; i++)
scanf("%d", &h[i]);
n = num;
creat();//建堆
heapsort();//堆排序
//輸出
printf("從小到大排序之後的輸出爲:\n");
for(i = 1; i <= num; i++)
printf("%d ", h[i]);
getchar();
getchar();
return 0;
}
堆排序算法實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.