数据结构堆排序

来源:互联网 发布:酷家乐橱柜设计软件 编辑:程序博客网 时间:2024/05/24 06:35
#include <bits/stdc++.h>using namespace std;//大顶堆 ,逻辑结构为完全二叉树,存储结构为一维数组 /*小顶堆的插入:每次插入都是将新数据放在数组最后。 //  新加入i结点  其父结点为i/2 void MinHeapFixup(int a[], int i)  {      int j, temp;            temp = a[i];      j = i/2;      //父结点      while (j >= 1 && i != 1)      {          if (a[j] <= temp)              break;                    a[i] = a[j];     //把较大的子结点往下移动,替换它的子结点          i = j;          j = i/2;      }      a[i] = temp;  }  */ int n;int length;int a[1005];void HeapAdjust(int a[],int s,int m)//筛选,s是要筛选结点的下标,m是最后一个结点下标 {//s,j分别是父结点和左孩子结点的下标 int temp=a[s]; //暂存到temp变量中 for(int j=2*s;j<=m;j*=2)//j是i结点的左孩子下标 {if(j<m&&(a[j]<a[j+1]))//j要小于m,不然j+1就越界了 ++j;//筛选左右孩子最大的结点的下标 if(!(temp<a[j]))//如果temp>=左右孩子,就跳出循环,不用交换 break;a[s]=a[j];//执行到这里,说明要交换 s=j; }a[s]=temp;}void HeapSort(int a[]){for(int i=length/2;i>=1;i--)//对非终端节点依次筛选,从length/2开始(即最后一个非终端结点) {HeapAdjust(a,i,length);}for(int i=length;i>1;--i)//将堆顶与最后一个元素交换,再对[1,i-1]重新调整为大顶堆 {swap(a[1],a[i]);HeapAdjust(a,1,i-1);}}int main(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i];length=n;HeapSort(a);for(int i=1;i<=n;i++)cout<<a[i]<<" "; return 0;} 

0 0
原创粉丝点击