#include <iostream> using namespace std; //大顶堆->排序 int sz[1000]={0,60,30,15,27,45,32,16,90,40,20,10,12}; //90 60 32 40 45 15 16 27 30 20 10 12 大顶 int n=12; void put(int x){ int k=x*2; if(k+1<=n&&sz[k+1]>sz[k]) k++; if(sz[x]<sz[k]){ swap(sz[x],sz[k]); if(k*2<=n) put(k); } } int main(){ for(int i=n/2;i>=1;i--){ put(i); } for(int i=1;i<=n;i++) cout<<sz[i]<<" ";cout<<endl; //排序 int i=1,j=n; while(i!=n){ swap(sz[i],sz[n--]); if(i!=n) put(i); } for(int i=1;i<=j;i++) cout<<sz[i]<<" "; /*重复 将堆顶与堆尾交换位置,重新排列堆顶 直到 堆内只剩一个*/ 数据大致有序,且频繁增删数据时需要排序,堆排序最合适 return 0; } 作业:堆及堆排序的代码要熟练掌握 完成:1369合并果子 杨子欧:尝试完成指针造堆以及堆排序 (责任编辑:admin) |