关闭

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

标签: 算法导论C语言
461人阅读 评论(0) 收藏 举报
分类:

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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:26916次
    • 积分:506
    • 等级:
    • 排名:千里之外
    • 原创:22篇
    • 转载:24篇
    • 译文:0篇
    • 评论:2条
    最新评论