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

原创 2013年12月03日 10:18:09

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. 运行结果


版权声明:本文为博主原创文章,未经博主允许不得转载。

算法导论:堆排序递归实现 (c语言)

我们算法老师让我下节课讲一下堆排序的算法,我就受累写了如下的代码,初学c语言的可以参照着看一下,如果你现在初学c语言,那么恭喜你你学习了一门可以收益终身的语言,c语言学好走遍天下都不怕,这是真的所有的...

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

算法导论 第六章 堆排序

【算法导论】归并排序,C语言实现

void merge(int* A , int p , int q , int r) { static int counter =0; printf("%d st int here\n...

【算法导论】c++实现堆排序

堆排序的过程就不说明了,代码如下: void Build_Max_Heap(int array_list[] ,const int array_size,const int index); bo...

堆排序(算法导论实现)

#include #include using namespace std; int heap_size; int left(int i){ return 2 * i + 1; } int...

《算法导论的Java实现》 堆排序

来自http://blog.csdn.net/chen09/article/details/6428641 堆的概念不想多介绍,书上都有。这里只提几个基本概念,以说明后面的伪代码。 堆可以看出...

算法导论第六章-堆排序-Cpp代码实现

实现了算法导论第六章中堆排序

《算法导论》7、堆排序实现(C++)

做了一点优化,一是使用迭代代替了递归调用,二是使用移位代替了乘法。 #include #include #include using namespace std; void maxHeapify(...

【算法导论】堆排序实现

#ifndef HEAP_SORT_H #define HEAP_SORT_H #include #include #include #ifdef _DEBUG #include #endi...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法导论C语言实现: 堆排序
举报原因:
原因补充:

(最多只允许输入30个字)