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);
}
}