堆排序

#include
#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]);
	}
}

你可能感兴趣的:(算法模板,算法导论)