算法导论C语言实现: 堆排序

1. 源代码

#include <common.h>

typedef struct _heap_t {
	int length;	//array length
	int size;	//heap size
	int *data;
} heap_t;

#define PARENT(i) ((i-1)/2)
#define LEFT(i) (2*i + 1)
#define RIGHT(i) (2*i + 2)


//MAX-HEAPIFY
void MAX_HEAPIFY(heap_t *A, int i)
{
	int l = LEFT(i);
	int r = RIGHT(i);
	int largest = 0;
	int tmp = 0;

	if (l < A->size &&
	    A->data[l] > A->data[i]) {
		largest = l;
	} else {
		largest = i;
	}

	if (r < A->size &&
	    A->data[r] > A->data[largest]) {
		largest = r;
	}

	if (largest != i) {
		tmp = A->data[largest];
		A->data[largest] = A->data[i];
		A->data[i] = tmp;
		MAX_HEAPIFY(A, largest);
	}
}

//BUILD-MAX-HEAP
void BUILD_MAX_HEAP(heap_t *A)
{
	int i = 0;
	A->size = A->length;
	
	for (i = (A->length/2 - 1); i >= 0; --i) {
		MAX_HEAPIFY(A, i);
	}
}

//HEAPSORT
void HEAPSORT(heap_t *A)
{
	int i = 0;
	int tmp = 0;

	BUILD_MAX_HEAP(A);

	for (i = (A->length - 1); i >= 1; --i) {
		tmp = A->data[0];
		A->data[0] = A->data[i];
		A->data[i] = tmp;

		A->size = A->size - 1;
		MAX_HEAPIFY(A, 0);
	}
}

void main()
{
	int data[] = {5, 3, 17, 10, 84, 19, 7, 22, 9, 9, 20, 88, 10, 19, 23, 100};
	heap_t A = {sizeof(data)/sizeof(int), 0, data};
	int i = 0;

	TRACE("==========第六章 堆排序=========\n");

	HEAPSORT(&A);

	for (i = 0; i < sizeof(data)/sizeof(int); ++i) {
		TRACE("%d\t", data[i]);
	}
	TRACE("\n");

	system("pause");
}


2. 注释

HEAPSORT里的for语句相当于把第一个元素(最大的),最后后面较小的元素互换,换完后第一个元素较小,然后把它降下去。


3. 运行结果


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值