什么是堆排序?
实现堆排序,函数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);
}
}