6-1 堆排序分数

6-1 堆排序

分数 10

全屏浏览题目

切换布局

作者 王东

单位 贵州师范学院

实现堆排序,函数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

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

代码如下:

void HeapAdjust(SqList &L, int s, int m) {
    ElemType sr = L.r[s];

    for (int i = 2 * s; i <= m; i *= 2) {
        if (i < m && L.r[i].key < L.r[i + 1].key) ++i;
        if (sr.key >= L.r[i].key) break;
        L.r[s] = L.r[i];
        s = i;
    }

    L.r[s] = sr;
}

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 > 1; --i) {
        ElemType tmp = L.r[1];
        L.r[1] = L.r[i];
        L.r[i] = tmp;
        HeapAdjust(L, 1, i - 1);
    }
}

大根堆排序是一种基于比较的排序算法,它利用了这种数据结构的特点来进行。在大根中,每个节点的值都大于或等于其子节点的值,称为&ldquo;大顶”或&ldquo;最大”。以下是大根堆排序的基本步骤: 1. **建立大根**: - 首先将待排序数组构建成一个大根,通常从最后一个非叶子节点开始,逐层调整,使其满足的性质。 2. **交换顶元素**: -顶(最大值)与末尾元素交换位置,此时末尾就是最大值,然后删除的最后一个元素,并调整剩余部分成新的大根。 3. **重复以上过程**: - 对剩下的n-1个元素重复步骤2,每次都将当前顶与倒数第二个元素交换,再调整,直到整个数组有序。 下面是Python实现的大根堆排序函数示例: ```python def heapify(arr, n, i): largest = i left = 2 * i + 1 right = 2 * i + 2 # 如果左孩子比父节点大 if left &lt; n and arr[i] &lt; arr[left]: largest = left # 如果右孩子比最大的还大 if right &lt; n and arr[largest] &lt; arr[right]: largest = right # 如果需要,就交换并调整父节点 if largest != i: arr[i], arr[largest] = arr[largest], arr[i] heapify(arr, n, largest) # 主函数 HeapSort def HeapSort(arr): n = len(arr) # 构建初始 for i in range(n // 2 - 1, -1, -1): heapify(arr, n, i) # 排序阶段 for i in range(n - 1, 0, -1): arr[0], arr[i] = arr[i], arr[0] # 交换 heapify(arr, i, 0) # 调整剩余 # 测试 arr = [12, 11, 13, 5, 6, 7] HeapSort(arr) print("Sorted array is", arr)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值