堆排序实验报告.docx

上传人:b****6 文档编号:13163594 上传时间:2023-06-11 格式:DOCX 页数:9 大小:203.12KB
下载 相关 举报
堆排序实验报告.docx_第1页
第1页 / 共9页
堆排序实验报告.docx_第2页
第2页 / 共9页
堆排序实验报告.docx_第3页
第3页 / 共9页
堆排序实验报告.docx_第4页
第4页 / 共9页
堆排序实验报告.docx_第5页
第5页 / 共9页
堆排序实验报告.docx_第6页
第6页 / 共9页
堆排序实验报告.docx_第7页
第7页 / 共9页
堆排序实验报告.docx_第8页
第8页 / 共9页
堆排序实验报告.docx_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

堆排序实验报告.docx

《堆排序实验报告.docx》由会员分享,可在线阅读,更多相关《堆排序实验报告.docx(9页珍藏版)》请在冰点文库上搜索。

堆排序实验报告.docx

堆排序实验报告

一、实验目的

(1)了解堆排序方法概念;

(2)理解堆排序方法的求解过程;

(3)掌握堆排序方法运算

二、实验内容

(1)建立包含10个数据序列的堆(数据元素的值由自己设定);

(2)完成堆排序运算的程序;

(3)给出程序和堆排序前后的结果。

三、实验环境

1、硬件配置:

Pentium(R)Dual-Core9CUPE6500@2.93GHz,1.96的内存

2、软件环境:

MicrosoftWindowsXPProfessionalServicePack3,MicrosoftVisualC++6.0

四、需求分析

1、输入的形式和输入值的范围:

根据题目要求与提示先输入一维数组A的个数n,然后输入数组A中的元素,且数与数之间用空格隔开,回车。

2、输出的形式:

输出排好序后的数组A中的元素值。

3、程序所能达到的功能:

程序能将一个数据类型为整型的一维数组A,且数组A中的元素呈现无序状态,运行程序后能将A中的数据元素按从小到大的顺序输出。

4、测试数据:

输入数组A的元素个数n为6,数组A中的元素分别为8,512,9,23,66并用空格将数隔开,回车如:

851292366

589122366

输出排序好后的数组A为:

589122366.

五、概要设计

为了实现上述操作,应以数组为存储结构。

1、基本操作:

(1)voidHeapify(ints,intm)

(2)voidBuildHeap(intn)

(3)voidHeap_Sort(intn)

2、本程序包含二个模块:

(1)主程序模块;

(2)堆排序模块,建堆模块,堆调整模块

(3)模块调用图:

主程序模块

堆排序模块

建堆模块

堆调整模块

3、流程图

流程图见最后一页

六、详细设计

1、存储类型,

intR[MAX];

元素类型为整形。

2、每个模块的分析:

(1)主程序模块:

voidmain()

{

inti,n;

printf("请输入数组A元素的个数:

");

scanf("%d",&n);

if(n<=0||n>MAX)

{

printf("请重新输入n");

}

printf("请输入数组A的元素值\n");

for(i=1;i<=n;i++)

scanf("%d",&R[i]);

Heap_Sort(n);

printf("输出排好序后的A中的元素");

for(i=1;i<=n;i++)

printf("%3d",R[i]);

printf("\n");

}

(2)voidHeap_Sort(intn)堆排序函数模块

voidHeap_Sort(intn)

{//对R[1……n]进行堆排序,用R[0]做暂存单元

inti;

BuildHeap(n);//将R[1-n]简称初堆

for(i=n;i>1;i--)

{//对当前无序区R[1……n]进行堆排序,共做n-1趟

R[0]=R[1];//将堆顶和堆中最后一个元素交换

R[1]=R[i];//将R[1……n]重新调整为堆,仅有R[1]可能会违反堆性质

R[i]=R[0];

Heapify(1,i-1);

}

}

建堆函数模块

voidBuildHeap(intn)

{//由一个无序的序列简称一个堆

inti;

for(i=n/2;i>0;i--)

Heapify(i,n);

}

堆调整函数模块

voidHeapify(ints,intm)

{//对R[1……n]进行堆调整,用temp做暂存单元

intj,temp;

temp=R[s];

j=2*s;

while(j<=m)

{

if(R[j]

if(temp>R[j])break;

R[s]=R[j];

s=j;

j=j*2;

}

R[s]=temp;

}

3)函数调用关系图

main()

voidHeap_Sort(intn)

voidBuildHeap(intn)

voidHeapify(ints,intm)

3、完整的程序:

#include"stdio.h"

#defineMAX255

intR[MAX];

voidHeapify(ints,intm)

{//对R[1……n]进行堆调整,用temp做暂存单元

intj,temp;

temp=R[s];

j=2*s;

while(j<=m)

{

if(R[j]

if(temp>R[j])break;

R[s]=R[j];

s=j;

j=j*2;

}

R[s]=temp;

}

voidBuildHeap(intn)

{//由一个无序的序列简称一个堆

inti;

for(i=n/2;i>0;i--)

Heapify(i,n);

}

voidHeap_Sort(intn)

{//对R[1……n]进行堆排序,用R[0]做暂存单元

inti;

BuildHeap(n);//将R[1-n]简称初堆

for(i=n;i>1;i--)

{//对当前无序区R[1……n]进行堆排序,共做n-1趟

R[0]=R[1];//将堆顶和堆中最后一个元素交换

R[1]=R[i];//将R[1……n]重新调整为堆,仅有R[1]可能会违反堆性质

R[i]=R[0];

Heapify(1,i-1);

}

}

voidmain()

{

inti,n;

printf("请输入数组A元素的个数:

");

scanf("%d",&n);

if(n<=0||n>MAX)

{

printf("请重新输入n");

}

printf("请输入数组A的元素值\n");

for(i=1;i<=n;i++)

scanf("%d",&R[i]);

Heap_Sort(n);

printf("输出排好序后的A中的元素");

for(i=1;i<=n;i++)

printf("%3d",R[i]);

printf("\n");

}

七、程序使用说明及测试结果

1、程序使用说明

(1)本程序的运行环境为VC6.0。

(2)进入演示程序后即显示提示信息:

请输入数组A元素的个数:

回车;

请输入数组A的元素值:

851292366

输出排好序后的A中的元素:

589122366

2、测试结果:

例如:

输入:

851292366

输出:

589122366

3、调试中的错误及解决办法。

调试过程中,遇到了许多的问题,在建堆,堆调整和堆排序的过程中遇到了一些问题,通过查阅与数据结构相关联的的一些参考书目,能够将问题解决,比如堆排序有建大堆和小堆之分,然后排序结果有降序和升序的方法,开始是是按降序输出的结果,将R[j],R[j+1]关系做了调整后,得到升序的结果

运行界面

先输入数组A元素的个数后,回车:

再输入数组A的元素值:

后回车:

输出排好序后的A中的元素:

八、实验小结:

排序算法有很多,堆排序是其中之一,比如有冒泡排序,快速排序,插入排序等,每个算法都自己的优缺点,学习完堆排序和编写完堆排序的程序后,对堆排序有了更深层次的理解,此次编程还是遇到了些许问题,但是通过查阅图书馆相关的参考书目,能够顺利的完成本次作业。

 

签名:

日期:

实验成绩:

批阅日期:

 

 

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2