堆排序

#include<stdio.h>
#define N 1000
#define INF 999999999
struct node {
	int size;//堆大小 
	int length;//數組長度 
	int num[N];
};
void MAX_HEAPIFY(struct node &H, int i) { //最大堆維護
	int l = i * 2;//算出左孩子的下標
	int r = i * 2 + 1;//算出右孩子的下標
	int largest;
	if(l <= H.size && H.num[l] > H.num[i])
		largest = l;
	else
		largest = i;
	if(r <= H.size && H.num[r] > H.num[largest])
		largest = r;
	if(largest != i) { //如果以i爲根的堆,不是一個最大堆
		int t=H.num[largest];
		H.num[largest] = H.num[i];
		H.num[i] = t;
		MAX_HEAPIFY(H,largest);
	}
}
//創建最大堆 
void BUILD_MAX_HEAP(struct node &H) {
	H.size = H.length;
	for(int i = H.size / 2; i >= 1; i--)
		MAX_HEAPIFY(H,i);
}
//堆排序 
void HEAPSORT(struct node &H) {
	BUILD_MAX_HEAP(H);
	//每一次將堆頂的數與末尾的數交換,堆大小減一,然後再維護堆
	//一點一點的將堆排成一個有序數組 
	for(int i = H.length; i >= 2; i--) {
		int t = H.num[1];
		H.num[1] = H.num[i];
		H.num[i] = t;
		H.size--;
		MAX_HEAPIFY(H,1);
	}
}
int main() {
	struct node H;
	H.length = 10;
//	16 4 10 14 7 9 3 2 8 1
	H.num[0] = INF;
	for(int i=1; i <= H.length; i++) {
		scanf("%d",&H.num[i]);
	}
	HEAPSORT(H);
	for(int i=1; i <= H.length; i++){
		printf("%d ",H.num[i]);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章