R6-6 堆排序

什么是堆排序?



http://t.csdn.cn/W0WXR

实现堆排序,函数void HeapAdjust(SqList &L,int s,int m)为筛选法调整堆,函数void CreatHeap(SqList &L)把无序序列L.r[1..n]建成大根堆,函数void HeapSort(SqList &L)对顺序表L进行堆排序。

函数接口定义:

 

void HeapAdjust(SqList &L,int s,int m);//筛选法调整堆 void CreatHeap(SqList &L); //把无序序列L.r[1..n]建成大根堆 void HeapSort(SqList &L);//对顺序表L进行堆排序

其中 L 为顺序表,函数HeapAdjust假设L.r[s+1..m] 已经是堆,将L.r [s..m] 调整为以L.r[s] 为根的大根堆。

裁判测试程序样例:

 

#include <iostream> #define MAXSIZE 1000 using namespace std; typedef struct { int key; char *otherinfo; }ElemType; typedef struct { ElemType *r; int length; }SqList; void Create_Sq(SqList &L) { int i,n; cin>>n; //输入的值不大于 MAXSIZE for(i=1;i<=n;i++) { cin>>L.r[i].key; L.length++; } } void show(SqList L) { int i; for(i=1;i<=L.length;i++) if(i==1) cout<<L.r[i].key; else cout<<" "<<L.r[i].key; } void HeapAdjust(SqList &L,int s,int m);//筛选法调整堆 void CreatHeap(SqList &L); //把无序序列L.r[1..n]建成大根堆 void HeapSort(SqList &L);//对顺序表L进行堆排序 int main() { SqList L; L.r=new ElemType[MAXSIZE+1]; L.length=0; Create_Sq(L); HeapSort(L); show(L); return 0; } /* 请在这里填写答案 */

输入样例:

第一行输入一个数n(输入的值不大于 MAXSIZE)。
第二行依次输入n个数

9
30 45 53 78 65 9 12 17 23

输出样例:

输出升序排列的结果。

9 12 17 23 30 45 53 65 78

和一般的堆排序没什么不同,唯一的就是元素的位置有点麻烦 

void HeapAdjust(SqList& L, int s, int m)
{
    int x = L.r[s].key;
    for (int j = 2 * s; j <= m; j *= 2)
    {
        if (j < m && L.r[j].key < L.r[j + 1].key) j++;
        if (x >= L.r[j].key)  break;
        L.r[s].key = L.r[j].key;
        s = j;
    }
    L.r[s].key = x;
}

void CreatHeap(SqList& L)
{
    for (int i = L.length / 2; i > 0; i--)
        HeapAdjust(L, i, L.length);
    
}
void HeapSort(SqList& L)
{
    CreatHeap(L);
    for (int i = L.length; i > 0; i--)
    {
        swap(L.r[i].key, L.r[1].key);
        HeapAdjust(L, 1, i - 1);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值