堆排序

来源:互联网 发布:为什么mac不能玩lol 编辑:程序博客网 时间:2024/05/20 15:57
#include<iostream>using namespace std;//堆的插入--大根堆(用来建初堆)void MaxHeapFixup(int a[], int i){int temp;int j;temp=a[i];j=(i-1)/2;//j为父节点while(j>=0&&i!=0)//给i找到位置{if(a[j]>temp)// > 是插入大根堆   < 是插入小根堆break;a[i]=a[j];i=j;j=(i-1)/2;}a[i]=temp;}int main(){int a[]={48,62,35,77,55,14,35,98};int len=sizeof(a)/sizeof(a[0]);//建大根堆for(int i=0;i<len;i++){MaxHeapFixup(a,i);}for(int i=0;i<len;i++){cout<<a[i]<<" ";}cout<<endl;system("pause");return 0;}

 

以下为另外一种建立小根堆的过程,还有排序的过程:

#include<iostream>using namespace std;//从i节点开始调整,n为节点总数 父节点i的子节点为 2*i+1, 2*i+2//插入是从子节点往上找,而这个是从父节点往下找void MinHeapFixdown(int a[], int i, int n){    int j, temp;temp = a[i];//父节点j = 2 * i + 1;//子结点的左结点while (j < n){if(j+1<n&&a[j+1]<a[j]) //在左右孩子中找最小的j++;if(a[j]>=temp)break;a[i]=a[j];     //把较小的子结点往上移动,替换它的父结点i=j;j=2*i+1;}a[i]=temp;}//建立最小堆void MakeMinHeap(int a[], int n){for (int i = n / 2 - 1; i >= 0; i--)MinHeapFixdown(a, i, n);}void MinheapsortTodescendarray(int a[], int n){int t;for (int i = n - 1; i >= 1; i--){t=a[i];a[i]=a[0];a[0]=t;MinHeapFixdown(a, 0, i);//因为小根堆,所以 a[0] 一定是堆内最小的                        //所以每次将a[0]与a[i],即最后一个数就是最小的了                        //然后将 a[0]...a[i-1]重新建堆                        //小根堆得到从大到小的排序}}int main(){int a[]={48,62,35,77,55,14,35,98};int len=sizeof(a)/sizeof(a[0]);    cout<<"原始数:"<<endl;for(int i=0;i<len;i++){cout<<a[i]<<" ";}cout<<endl;cout<<"小根堆:"<<endl;MakeMinHeap(a,len);for(int i=0;i<len;i++){cout<<a[i]<<" ";}cout<<endl;cout<<"堆排序后:"<<endl;MinheapsortTodescendarray(a,len);for(int i=0;i<len;i++){cout<<a[i]<<" ";}cout<<endl;system("pause");return 0;}


0 0
原创粉丝点击