堆排序

问题:对可以分为大顶堆和小顶堆。

大顶堆满足父节点大于左右孩子节点:父节点i,则i>2*i  ;i>2*i+1;

小顶堆满足父节点小于左右孩子节点:父节点i,则i<2*i  ;i<2*i+1;

指针问题,在交换两个变量时,确保交换,要用指针。

下面代码是小顶堆排序。

代码:

#include  <iostream>
using namespace std;

void buildHeap(int arr[],int length)         //建立堆
{
	int i;
	int *min;
	int *temp;
	int t;
	int f;
	int k;
	int flag;
	int n=length/2;
	for(i=n;i>0;i--)
	{
		f=i;
	
		while(2*f<=length)            //循环向下判断
		{
			temp=&arr[f-1];
			min=&arr[2*f-1];
			flag=2*f;
			if(2*f+1<=length)
			{
				if(arr[2*f]<*min)     //选择孩子节点中较小的节点
				{
					min=&arr[2*f];
					flag=2*f+1;
				}
			}
			if(*min<*temp)            //父节点小于孩子节点,则交换
			{
			//	cout<<*temp<<":"<<*min<<"--";
				t=*temp;
				*temp=*min;
				*min=t;
				f=flag;
			//	cout<<flag<<"--";
			}
			else
				break;
		}

	}
}
void heapSort(int arr[],int length)          //  堆排序
{
	buildHeap(arr,length);
	cout<<arr[0]<<"  ";
	arr[0]=arr[length-1];
}
int main()
{
	int arr[10]={9,3,5,1,2,0,4,8,6,7};
	int i,j;
	cout<<"排序前:"<<endl;
	for(i=0;i<10;i++)
	{
		cout<<arr[i]<<"  ";
	}
	cout<<endl;
	cout<<"堆排序后:"<<endl;
	for(j=10;j>0;j--)
	{
		heapSort(arr,j);
	}
	cout<<endl;
	return 0;
}

 运行结果:

posted @ 2013-05-30 20:59  xshang  阅读(335)  评论(0编辑  收藏  举报