堆排序

堆 ( 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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值