您的位置:首页 > 其它

《算法导论》(二)--堆排序

2010-09-21 08:45 155 查看
中间计算复杂度与递归式太晕了,看的不甚明白,现在自感功力不够,修为不够,以后回头再看。。

终于弄明白了堆排序的方法。。调整堆有点麻烦,记得时刻保持堆的性质就好了。。



#include <iostream>
using namespace std;
#define LENGTH 10
int heap_size=0,size=LENGTH;
void max_heapify(int array[],int i)
{//下标的问题要注意
	int l=(i<<1)+1;
	int r=(i<<1)+2;
	int largest;
	if(l<heap_size&&array[l]>array[i])
	{
		largest=l;
	}
	else
	{
		largest=i;
	}
	if(r<heap_size&&array[r]>array[largest])
	{
		largest=r;
	}
	if(largest!=i)
	{
		swap(array[i],array[largest]);
		max_heapify(array,largest);
	}
}
void build_max_heap(int array[])
{
	heap_size=size;
	for (int i=(size%2==0?size/2-1:size/2);i>=0;i--)
	{//当对某结点调用MAX_heapify时,该结点的两棵子树都已是最大堆
	//为什么不是从0开始??递归定义结构决定。
		max_heapify(array,i);
	}
}
void heap_sort(int array[])
{
	build_max_heap(array);
	for (int i=LENGTH-1;i>=1;i--)
	{
		swap(array[0],array[i]);
		heap_size=heap_size-1;
		size--;
		max_heapify(array,0);//根结点下标为0
	}
}
int main()
{
	int array[]={4,1,3,2,16,9,10,14,8,7};
	heap_sort(array);
	for (int i=0;i<LENGTH;i++)
	{
		cout<<array[i]<<" ";
	}
	cout<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: