堆排序练习代码

练习题目:递增堆排序(算法)

相关介绍:

堆排序(Heapsort)是指利用这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

最大堆是二叉堆的两种形式之一。 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆


最大堆,将角标i的结点与其两个子结点构成“局部最大堆,如果发生了父结点和子结点交换,则对被交换的子结点位置继续向下递归构建最大堆。函数执行后,该结点与其子树则构成完整的最大堆。其时间复杂度为O(lgn)。

<span style="font-size:14px;">/// Make i node and its subtrees a max-heap tree
void Max_Heapify(int* a, int size, int i){
	int l = 2 * i, r = 2 * i + 1;
	int largest = i;
	int exchange;

	//Compare with left child
	if (l<size&&a[l]>a[i])
		largest = l;
	else
		largest = i;

	//Compare with right child
	if (r<size&&a[r]>a[largest])
		largest = r;

	//It need to exchange with child node
	if (largest != i){
		exchange = a[i];
		a[i] = a[largest];
		a[largest] = exchange;

		//Make exchanged node and its subtrees a max-heap tree
		Max_Heapify(a, size, largest);
	}
}</span>


将无序的数组构建为最大堆。从最后一个元素的父结点开始向上遍历,对每个结点执行Max_Heapify函数。时间复杂度为O(nlgn)。

<span style="font-size:14px;">/// Build a max-heap tree
void Build_Max_Heap(int* a, int size){
	int i;
	for (i = size / 2 - 1; i >= 0; --i){
		Max_Heapify(a, size, i);
	}
}</span>

堆排序函数。对已经构建好的最大堆进行排序。相应的,递增排序需要构建最大堆,递减排序需要构建最小堆。时间复杂度O(nlgn)。

<span style="font-size:14px;">/// Heap sort
void HeapSort(int* a, int size){
	int i;
	int exchange;

	for (i = size - 1; i >= 0; --i){
		exchange = a[i];
		a[i] = a[0];
		a[0] = exchange;

		--size;
		Max_Heapify(a, size, 0);
	}
}</span>


测试主函数。

<span style="font-size:14px;">int main(){
	int i;
	int a[] = { 1, 56, 32, 42, 78, 60, 0, 23, 100, -6, -20, 56, 27 };
	Build_Max_Heap(a, sizeof(a) / sizeof(int));
	HeapSort(a, sizeof(a) / sizeof(int));
	for (i = 0; i < sizeof(a) / sizeof(int); ++i)
		printf("%d ", a[i]);
	puts("");
}</span>


输出。

<span style="font-size:18px;">-20 -6 0 1 23 27 32 42 56 56 60 78 100 </span>





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值