算法导论-堆排序

#include "stdio.h"

最大堆 A[parent(i)] >= A[i]
最小堆 A[parent(i)] <= A[i]
//递归
void MAX_HEAPIFY (int *A,int pos,int length) {
		int l = pos << 1;
		int r = (pos << 1) + 1;
		int largest = pos;
		if (l <= length && A[largest] < A[l]) {
				largest = l;
		}
		if (r <= length && A[largest] < A[r]) {
				largest = r;
		}
		if (pos != largest) {
				int t = A[pos];
				A[pos] = A[largest];
				A[largest] = t;
				MAX_HEAPIFY (A,largest,length);
		}
}
//非递归
void MAX_HEAPIFY_2 (int *A,int pos,int length) {
		int i,j,l,r,t;
		t = A[pos];
		i = j = pos;
		wh学校·ile (i <= length){
				l = i << 1;
				r = l + 1;
				if (l <= length && A[l] > A[j]) {
						j = l;
				}
				if (r <= length && A[r] > A[j]){
						j = r;
				}
				if (i == j) {
						return;
				}else {
						A[i] = A[j];
						i = j;
						A[j] = t;
				}

		}
}
//建最大堆
void BUILD_MAX_HEAP (int *A,int length) {
		int j = length / 2;
		while (j) {
			MAX_HEAPIFY (A,j,length);
			j--;
		}
}
//建最大堆
void BUILD_MAX_HEAP_2 (int *A,int length) {
	int j = length / 2;
	while (j) {
		MAX_HEAPIFY_2 (A,j,length);
		j--;
	}
}

void HEAPSORT (int *A,int length) {
	int i,t;
	BUILD_MAX_HEAP (A,length);
	for (i = length;i >= 2;i--) {
		t = A[1];
		A[1] = A[i];
		A[i] = t;
		MAX_HEAPIFY (A,1,i-1);
	}
}

void HEAPSORT_2 (int *A,int length) {
	int i,t;
	BUILD_MAX_HEAP_2 (A,length);
	for (i = length;i >= 2;i--) {
		t = A[1];
		A[1] = A[i];
		A[i] = t;
		MAX_HEAPIFY_2 (A,1,i-1);
	}
}
void print (int *A,int start,int length) {
		int i;
		for (i = start;i < start + length;i++) {
				printf ("%d ",A[i]);
		}
		printf ("\n");
}
int main () {
		int A[] = {-1,4,1,3,2,16,9,10,14,8,7};
		int B[] = {-1,4,1,3,2,16,9,10,14,8,7};
		print (A,1,10);
		HEAPSORT (A,10);
		print (A,1,10);
		HEAPSORT_2 (B,10);
		print (B,1,10);
		return 0;
}
/*
 *4 1 3 2 16 9 10 14 8 7 
 *1 2 3 4 7 8 9 10 14 16 
 *1 2 3 4 7 8 9 10 14 16
 */

算法的正确性:可以用循环不变式证明;运行时间为nlogn;



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值