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

来源:互联网 发布:本科生导师制 知乎 编辑:程序博客网 时间:2024/06/14 08:35
/*函数:堆排序创建最大堆维护最大堆排序最大堆通过数组存储二叉树时间:15.7.14Jason 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;}

这里写图片描述

0 0