堆排序算法實現

#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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章