急求数据结构编程之“堆排序” 十万火急!!!!

来源:百度知道 编辑:UC知道 时间:2024/05/11 15:57:08
堆排序

1、预习要求:堆排序方法。
2、实验目的:
(1)了解堆排序方法概念;
(2)理解堆排序方法的求解过程;
(3)掌握堆排序方法运算。
3、实验内容及要求:
(1)建立包含30个数据序列的堆(数据元素的值由自己设定);
(2)完成堆排序运算的程序;
(3)给出程序和堆排序前后的结果。

/*
这个算法的实现没有按照书上的做法,书的算法变量太多,且命名混乱,不容易分析和理解,所以我采用了严蔚敏版的算法.
另外,书中在排序开始时是讲,所有的排序都是从小到大的排序,但现在的做法是将小的结点放在了数组的后面,又没有说明.
*/
#include "stdafx.h"
#include <iostream.h>
#include <malloc.h>

int const count=8;

typedef struct
{
int key;
}records;

typedef records list[count+1];

//堆的首结点调整
//在r中,大于s的节点都已经满足堆的性质,即r[s+1],r[s+2]..r[m],只有r[s]是使堆不成立的结点,那么这里就只调整它
void HeapAdjust(list & r,int s,int m)
{
//记录初始的值,以便在适当的位置将其插入到其它位置,而将此子树下的最大结点放在r[s]中
int key=r[s].key;
//这里用j<=m,是因为j=m即是上一个结点的一个左孩子,那么因为有左孩子则也是需要进行比较的
//如果在进到入循环时,j>m,则说明上次循环的j便是叶子结点了
for(int j=2*s;j<=m;j*=2)
{
//这里用j<m,是用来判断上一个结点也即父结点,是否有左孩子和右孩子,如果没有右孩子,则只需要比较父结点和左孩子的值即可
//如果上个父结点有左/右孩子,则需要比较这两个左右孩子,然后判断左孩子是否小于右孩子,如果小于,则让j++,使r[j]指向的是
//较大的右孩子的结点,使其从大的方向继续查找
if (j<m && r[j].key<r[j+1].key)<