最大堆調整:將堆的末端子節點做調整,使得子節點永遠小於父節點
建立最大堆:將堆中的全部數據從新排序
堆排序:移除位在第一個數據的根節點,並作最大堆調整的遞歸運算ios
//算法8.9 堆排序 #include <iostream> using namespace std; #define MAXSIZE 20 //順序表的最大長度 typedef struct { int key; char *otherinfo; }ElemType; //順序表的存儲結構 typedef struct { ElemType *r; //存儲空間的基地址 int length; //順序表長度 }SqList; //順序表類型 //用算法8.7 篩選法調整堆 void HeapAdjust(SqList &L,int s,int m) { //假設r[s+1..m]已是堆,將r[s..m]調整爲以r[s]爲根的大根堆 ElemType rc; int j; rc=L.r[s]; for(j=2*s;j<=m;j*=2) { //沿key較大的孩子結點向下篩選 if(j<m&&L.r[j].key<L.r[j+1].key) ++j; //j爲key較大的記錄的下標 if(rc.key>=L.r[j].key) break; //rc應插入在位置s上 L.r[s]=L.r[j]; s=j; } L.r[s]=rc; //插入 } //HeapAdjust void Create_Sq(SqList &L) { int i,n; cout<<"請輸入數據個數,不超過"<<MAXSIZE<<"個。"<<endl; cin>>n; //輸入個數 cout<<"請輸入待排序的數據:\n"; while(n>MAXSIZE) { cout<<"個數超過上限,不能超過"<<MAXSIZE<<",請從新輸入"<<endl; cin>>n; } for(i=1;i<=n;i++) { cin>>L.r[i].key; L.length++; } } //用算法8.8 建初堆 void CreatHeap(SqList &L) { //把無序序列L.r[1..n]建成大根堆 int i,n; n=L.length; for(i=n/2;i>0;--i) //反覆調用HeapAdjust HeapAdjust(L,i,n); } //CreatHeap void HeapSort(SqList &L) { //對順序表L進行堆排序 int i; ElemType x; CreatHeap(L); //把無序序列L.r[1..L.length]建成大根堆 for(i=L.length;i>1;--i) { x=L.r[1]; //將堆頂記錄和當前未經排序子序列L.r[1..i]中最後一個記錄互換 L.r[1]=L.r[i]; L.r[i]=x; HeapAdjust(L,1,i-1); //將L.r[1..i-1]從新調整爲大根堆 }//for }//HeapSort void show(SqList L) { int i; for(i=1;i<=L.length;i++) cout<<L.r[i].key<<endl; } void main() { SqList L; L.r=new ElemType[MAXSIZE+1]; L.length=0; Create_Sq(L); HeapSort(L); cout<<"排序後的結果爲:"<<endl; show(L); }