码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序算法及C语言实现

时间:2014-11-02 13:57:31      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:算法导论   c语言   堆排序   算法   排序算法   

堆排序算法的时间复杂度是O(nlgn),比插入排序要好,跟归并排序相同,但是与归并排序不一样的地方在于,堆排序不需要额外的存储空间,或者说,只需要常数个额外的存储空间,属于内排序算法。

有关插入排序和归并排序,请参照:

插入排序及C语言实现归并排序及C语言实现

原理是构造最大堆,并将根节点(最大值)放到数组有效最后位,直到堆节点数量为1。


#include <stdio.h>

int parent(int i);
int left(int i);
int right(int i);
void max_heapify(int *a,int i,int len);
void build_max_heap(int *a,int len);
void heapsort(int *a,int len);

main()
{
	int i;
	int a[10] = {32,54,12,7,4,34,67,12,33,10};
	heapsort(a,10);
//	max_heapify(a,2,10);
	//build_max_heap(a,10);
	for (i = 0;i < 10;i++)
		printf("%d  ",a[i]);
	printf("\n");
}

int parent(int i)
{
	return i/2;
}
int left(int i)
{
	return 2*i;
}
int right(int i)
{
	return 2*i+1;
}
void max_heapify(int *a,int i,int len)
{
	int l,r,largest,heap_size;
	l = left(i);
	r = right(i);
	heap_size = len;
	if (l <= heap_size && a[l-1] > a[i-1])
		largest = l;
	else largest = i;
	if (r <= heap_size && a[r-1] > a[largest-1])
		largest = r;
	if (largest != i) {
		a[i-1] = a[i-1] ^ a[largest-1];
		a[largest-1] = a[i-1] ^ a[largest-1];
		a[i-1] = a[largest-1] ^ a[i-1];
		max_heapify(a,largest,len);
	}
}
void build_max_heap(int *a,int len)
{
	int heap_size,i;
	heap_size = len;
	for (i = len/2;i >= 1;i--)
		max_heapify(a,i,heap_size);
}
void heapsort(int *a,int len)
{
	int i,heap_size;

	heap_size = len;
	build_max_heap(a,heap_size);
	for (i = heap_size;i >= 2;i--) {
		a[0] = a[0] ^ a[i-1];
		a[i-1] = a[0] ^ a[i-1];
		a[0] = a[0] ^ a[i-1];
		heap_size--;
		max_heapify(a,1,heap_size);
	}
}


堆排序算法及C语言实现

标签:算法导论   c语言   堆排序   算法   排序算法   

原文地址:http://blog.csdn.net/bing_bing304/article/details/40707787

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!