课程设计 有没有人会堆排序算法的实现 急~

来源:百度知道 编辑:UC知道 时间:2024/06/06 13:34:06
设计内容:堆排序是树形选择排序的一种。其基本思想是将原始待排序记录序列建成一个堆,称之为初始堆,并输出堆顶元素;调整剩余的记录序列,使之成为一个新堆,再输出堆顶元素;依此类推,当堆中只剩一个元素时,整个序列排序结束,输出序列即是排序后的有序序列。要求在理解堆概念的基础上,依据完全二叉树中双亲、孩子结点间的内在关系,采用顺序存储结构保存由键盘随机输入的待排序序列,在此结构上解决建初始堆和去堆顶元素后重建堆的问题,从而得到有序输出序列,实现堆排序。
设计要求:1.遵循结构化程序设计思想,采用C/C++实现。
2.界面友好,操作简便,容错性好。

#include <iostream>
#include <algorithm>
using namespace std;
#define MAXN 10000
#define _cp(a,b) ((a)<(b))//最小堆,若要最大堆将'<'改为'>'
typedef int elem_t;

struct heap
{
elem_t h[MAXN];
int n,p,c;
void init(){n=0;}
void ins(elem_t e){//插入一个元素e
for (p=++n;p>1&&_cp(e,h[p>>1]);h[p]=h[p>>1],p>>=1);//插入一个元素,并调整堆
h[p]=e;
}
int del(elem_t& e){//e赋值为堆顶元素,删掉堆顶元素后并重建堆,堆空返回0,否则返回1
if (!n) return 0;
for (e=h[p=1],c=2;c<n&&_cp(h[c+=(c<n-1&&_cp(h[c+1],h[c]))],h[n]);h[p]=h[c],p=c,c<<=1);//取堆顶元素并调整堆
h[p]=h[n--];
return 1;
}
void show()
{
printf("\n,堆中有%d个元素:\n他们是:",n);
int i;
for(i=1;i<=n;++i)
{
cout<<h[i]<<" ";
}
cout<<endl;
system("pause");
}
heap(){init();}
};