您的位置:首页 > 其它

堆排序实现

2012-11-11 12:32 323 查看
今天抽空写了个堆排序的算法,废话不多说,直接上源代码:

#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;

#define MAXSIZE 6

void print(int a[],int size = MAXSIZE)
{
int i;
for(i=0;i<size;i++)
cout<<a[i]<<" ";
cout<<endl;
}
void percolate_down(int a[],int size,int i)
{
int pre,max,lchild,rchild;
if(size<=1||i<0||i>size-1) return ;
pre=max=i;
while(max<size/2)
{
pre=max;
lchild = max*2+1;
rchild = max*2+2;
if(lchild<size&&a[lchild]>a[max]) max = lchild;
if(rchild<size&&a[rchild]>a[max]) max = rchild;
if(max!=pre)
swap(a[max],a[pre]);
else break;
}
}

void percolate_up(int a[],int size,int i)
{
int pre,min,parent;
if(size<=1||i<0||i>size-1) return ;
pre=min=i;
while(min>0)
{
pre=min;
parent = (min-1)/2;
if(parent>=0&&a[parent]<a[min]) min = parent;
if(min!=pre)
swap(a[min],a[pre]);
else break;
}
}

void pop_heap(int a[],int size)
{
if(size<1) return;
int value = a[0];
swap(a[0],a[size-1]);
percolate_down(a,size-1,0);
}

void push_heap(int a[],int size)
{
if(size<1) return;
percolate_up(a,size,size-1);
}

void make_heap(int a[], int size)
{
int i;
for(i=size/2;i>=0;i--)
percolate_down(a,size,i);
}

void sort_heap(int a[], int size)
{
for(int i=size;i>0;i--)
pop_heap(a,i);
}

int main()
{
int a[MAXSIZE+10]={1,4,5,8,12,14};
make_heap(a,MAXSIZE);
print(a,MAXSIZE);
//	sort_heap(a,MAXSIZE);
//   print(a,MAXSIZE);
//a[MAXSIZE] = 3;
//push_heap(a,MAXSIZE+1);
//print(a,MAXSIZE+1);
//sort_heap(a,MAXSIZE+1);
//print(a,MAXSIZE+1);
for(int i=MAXSIZE;i>0;i--)
{
cout<<a[0]<<" ";
pop_heap(a,i);
}
cout<<endl;
system("pause");
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: