您的位置:首页 > 其它

堆排序 算法摘记

2014-09-21 21:48 363 查看
详细见算法导论:

最坏运行时间O(nlgn)

/*
堆排序 参考算法导论 
heap

数组的关系坐标都要减1 
*/
#include<iostream>
#include<stdio.h>
using namespace std;

int len;

void swap(int A[],int a,int b)
{
	int temp=A[a];
	A[a]=A[b];
	A[b]=temp;
} 

void max_heap(int A[],int i,int n)
{
	int l,r,max;
	l=2*i;//数组起始是0 l=a[2*i+1],r=A[2*i+2];
	r=2*i+1;
	
	if(l<=n&&A[l]>A[i])//寻找三者中最大的 
		max=l;
	else 
		max=i;
	if(r<=n&&A[r]>A[max])
		max=r;
		
	if(max!=i)
	{
		swap(A,max,i);
		max_heap(A,max,n);
	}	
} 

void build_heap(int A[],int len)
{
	for(int i=len/2;i>=1;i--)//非叶子节点开始建堆 
		max_heap(A,i,len);
}

void heap_sort(int A[],int n)
{
	build_heap(A,len);
	for(int i=len;i>1;i--)//每次最后一个与第一个最大的交换 
	{
		swap(A,1,i);
		n--;
		max_heap(A,1,n);
	}
} 

int main()
{
	int A[100];

    while(scanf("%d",&len))
    {
        int i;
        for(i=1;i<=len;i++)
            cin>>A[i];
        heap_sort(A,len);
        for(i=1;i<=len;i++)
            cout<<A[i]<<" ";
        cout<<endl;
    }
	
	return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: