现在的位置: 首页 > 综合 > 正文

堆排序 算法摘记

2018年01月19日 ⁄ 综合 ⁄ 共 725字 ⁄ 字号 评论关闭

详细见算法导论:

最坏运行时间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;
}

抱歉!评论已关闭.