您的位置:首页 > 运维架构

堆排序 维护最大堆 创建最大堆 排序最大堆

2015-07-14 11:26 288 查看
/*
函数:堆排序
创建最大堆
维护最大堆
排序最大堆
通过数组存储二叉树

时间:15.7.14
Jason Zhou
热爱你所写下的程序,他是你的伙伴,而不是工具.
*/

#include<iostream>
using namespace std;

//交换两个元素
int swap_data(int &a,int &b)
{

int tmp=a;
a=b;
b=tmp;
return 0;
}

//维护堆的性质
int max_heapify(int arr[],int i,int len)
{

//和子节点的最大值进行比较.比最大值大,不交换.否则和最大值交换
int l=2*i+1;
int r=2*i+2;
int largest=i;

if (l<=len && arr[l]>arr[i])
{
largest=l;
}
else
{
largest=i;
}

if (r<=len && arr[r]>arr[largest] )
{
largest=r;
}

if (largest!=i)
{
swap_data(arr[i],arr[largest]);
max_heapify(arr,largest,len);
}
return 0;
}

//建队过程
int build_max_heap(int a[],int len)
{
for (int i=(len-1)/2;i>=0;i--)
{
max_heapify(a,i,len-1);
}
return 0;
}

//堆排序
int heap_sort(int arr[],int len)
{
//首先创建最大堆
build_max_heap(arr,len);

for (int i=(len-1);i>0;i--)
{
swap_data(arr[0],arr[i]);//每次将最大值换到最后,然后让 arr[0..i-1] 构建最大堆
max_heapify(arr,0,i-1);
}
return 0;
}

int main()
{
int data[13]={8,5,4,6,13,7,1,9,12,11,3,10,2};
int len=sizeof(data)/sizeof(data[0]);
cout<<"原始数据"<<endl;
for (int i=0;i<len;i++)
{
cout<<data[i]<<" ";
}
cout<<endl;

build_max_heap(data,len);//创建最大堆
cout<<"创建最大堆"<<endl;
for (int i=0;i<len;i++)
{
cout<<data[i]<<" ";
}
cout<<endl;

heap_sort(data,len);
cout<<"堆排序"<<endl;
for (int i=0;i<len;i++)
{
cout<<data[i]<<" ";
}
cout<<endl;

return 0;
}


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