堆 ( Heap )设有一个关键字集合,按完全二叉树的顺序存储方式存放在一个一维数组中。对它们从根开始,自顶向下,同一层自左向右从 1开始连续编号。若满足
Ki <= K2i && Ki <= K2i+1
或 Ki >= K2i && Ki>= K2i+1,
则称该关键字集合构成一个堆。
前者成为最小堆,后者称为最大堆。
利用堆及其运算, 可以很容易地实现选择排序的思路。
堆排序分为两个步骤
1.根据初始输入数据,利用堆的调整算法 HeapAdjust( ) 形成初始堆;
2.通过一系列的对象交换和重新调整堆进行排序。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
using namespace std;
#define MAXSIZE 200
typedef struct {
int r[MAXSIZE+1];
int length;
} SqList;
void HeapAdjust (SqList &H, int s, int m){
//设大顶堆为H.r[s..m],且H.r[s]需要调整
int rc=H.r[s];
int j;
for (j=2*s;j<=m;j*=2){
if(j<m && (H.r[j]<H.r[j+1])) ++j;
if(!(rc<H.r[j])) break;
H.r[s]=H.r[j];s=j;
}
H.r[s]=rc;
for(int i=1; i<=10; i++) {
cout<<H.r[i]<<" ";
}
cout<<endl;
}//HeapAdjust
void HeapSort (SqList &H) {
int temp,i,j;
for (i=H.length/2;i>0;--i) //建立堆
HeapAdjust (H,i,H.length);
for (i=H.length;i>1;--i) { //排序
temp=H.r[1];
H.r[1]=H.r[i];
H.r[i]=temp;
HeapAdjust (H,1,i-1);
}
}//HeapSort
int main() {
srand(time(0));
SqList L;
L.length=10;
for(int i=1; i<=10; i++) {
L.r[i]=rand()%100;
}
for(int i=1; i<=10; i++) {
cout<<L.r[i]<<" ";
}
puts("");
HeapSort (L);
for(int i=1 ;i<=10; i++) {
cout<<L.r[i]<<" ";
}
puts("") ;
return 0;
}