您的位置:首页 > 其它

堆排序

2016-12-30 22:30 337 查看
#include<iostream>

using namespace std;

int heap_size=10;

void exchange(int *a,int *b)

{

int t=*a;

*a=*b;

*b=t;

}

void max_heapify(int *a,int i)//维持某个结点为最大堆

{

if(i<heap_size/2)///?

return ;

int left=2*i;

int right=2*i+1;

int largest;

if(left<=heap_size&&a[left]>a[i])

largest=left;

else

largest=i;

if(right<=heap_size&&a[right]>a[largest])

largest=right;

if(largest!=i)

{

exchange(&a[i],&a[largest]);

max_heapify(a,largest);

}

}

void build_max_heapify(int *a)//建最大堆

{

int len=heap_size;

for(int i=len/2;i>0;--i)

max_heapify(a,i);

}

void print(int *a)

{

int len=heap_size;

for(int i=0;i<len;++i)

cout<<a[i]<<"  ";

cout<<endl;

}

void heapsort(int *a)

{

build_max_heapify(a);

for(int i=heap_size;i<=2;--i)//堆排序

{

exchange(&a[1],&a[i]);

heap_size=heap_size-1;

max_heapify(a,1);

}

}

int  heap_extract_max(int *a)//去掉最大值,并返回最大值

{

if(heap_size<1)

cout<<"heap overflow"<<cout<<endl;

int max=a[1];

a[1]=a[heap_size];

--heap_size;

max_heapify(a,1);

return max;

}

void heap_increase_key(int *a,int i,int key)//在i位置将关键字增加为key,只能是增加,若key小于a[i],则操作无效

{

if(key<a[i])

cout<<"new key is smaller than current key"<<endl;

else

{

a[i]=key;

while(i>1&&a[i/2]<a[i])

    {

    exchange(&a[i],&a[i/2]);

    i=i/2;

    }

}

}

void max_heap_insert(int *a,int key)

{

++heap_size;

a[heap_size]=-1000;//首先扩大堆的大小,并把增加的新位置的值设为极小值,以保证正确值的插入

heap_increase_key(a,heap_size,key);

}

int main()

{

int a[15]={0,4,1,3,2,16,9,10,14,8,7};

heapsort(a);

print(a+1);

int max=heap_extract_max(a);

cout<<"max: "<<max<<endl;

print(a+1);

heap_increase_key(a,5,13);

print(a+1);

max_heap_insert(a,666);

print(a+1);

return 0;

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