北京理工大学数据结构实验报告4_第1页
北京理工大学数据结构实验报告4_第2页
北京理工大学数据结构实验报告4_第3页
北京理工大学数据结构实验报告4_第4页
北京理工大学数据结构实验报告4_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据结构与算法统计实验报告 实验四学院: 班级:学号:姓名: 一、实验目的 1、熟悉VC环境,学会使用C语言利用顺序表解决实际问题。2、通过上机、编程调试,加强对线性表的理解和运用的能力。3、锻炼动手编程,独立思考的能力。二、实验内容 从键盘输入10个数,编程实现分别用插入排序、交换排序、选择排序算法进行排序,输出排序后的序列。三、程序设计 1、概要设计为了实现排序的功能,需要将输入的数字放入线性表中,进行进一步的排序操作。(1)抽象数据类型:ADT SqList 数据对象:D=数据关系:R1= 基本操作:InPut(SqList &L)操作结果:构造一个线性表L。OutPut(SqList

2、L)初始条件:线性表L已存在。操作结果:按顺序在屏幕上输出L的数据元素。InsertSort(SqList &L)初始条件:线性表L已存在。操作结果:对L的数据元素进行插入排序。QuickSort(SqList &L)初始条件:线性表L已存在。操作结果:对L的数据元素进行快速排序。SelectSort(SqList &L)初始条件:线性表L已存在。操作结果:对L的数据元素进行选择排序。ADT SqList 主程序流程由主程序首先调用InPut(L)函数创建顺序表,调用InsertSort(L)函数进行插入排序,调用OutPut(L)函数显示排序结果。再由主程序首先调用InPut(L)函数创建顺

3、序表,调用QuickSort(L)函数进行交换排序,调用OutPut(L)函数显示排序结果。再由主程序首先调用InPut(L)函数创建顺序表,调用SelectSort(L)函数进行选择排序,调用OutPut(L)函数显示排序结果。模块调用关系由主函数模块调用创建顺序表模块,排序模块与显示输出模块。流程图开始结束创建线性表创建线性表创建线性表进行插入排序进行交换排序进行选择排序输出排序结果输出排序结果输出排序结果 2、详细设计 (1)数据类型设计#define MAXSIZE 15/用作示例的小顺序表的最大长度typedef structint key;/关键字项int otherinfo;/其

4、它数据项RedType;/记录类型typedef structRedType rMAXSIZE+1;/r0闲置或用作哨兵单元int length;/顺序表长度SqList;/顺序表类型 (2)操作算法设计void InPut(SqList &L)/输入数字,创建顺序表int i;printf(请输入10个数字:n);L.length=10;for(i=1;i=L.length;i+)scanf(%d,&L.ri.key);void InsertSort(SqList &L)/对顺序表L作直接插入排序int i,j;for(i=2;i=L.length;i+)if(L.ri.keyL.ri-1.

5、key)/如果“”,需将L.ri插入有序子表L.r0.key=L.ri.key;/复制为哨兵L.ri.key=L.ri-1.key;for(j=i-2;L.r0.keyL.rj.key;j-)L.rj+1.key=L.rj.key;/记录后移L.rj+1.key=L.r0.key;/插入到正确位置int Partition(SqList &L,int low,int high)/交换顺序表L中子表rlowhigh的记录,枢轴记录到位,并返回其所在位置,/此时在它之前(后)的记录均不大(小)于它。int pivotkey;L.r0.key=L.rlow.key;/用子表的第一个记录作枢轴记录pi

6、votkey=L.rlow.key;/枢轴记录关键字while(lowhigh)/从表的两端交替地向中间扫描while(low=pivotkey)-high;/将比枢轴记录小的记录移到低端L.rlow.key=L.rhigh.key;while(lowhigh&L.rlow.key=pivotkey)+low;/将比枢轴记录大的记录移到高端L.rhigh.key=L.rlow.key;L.rlow.key=L.r0.key;/枢轴记录到位return low;/返回枢轴位置void QSort(SqList &L,int low,int high)/对顺序表L中的子序列L.rlowhigh作快

7、速排序int pivotloc;if(lowhigh)/长度大于1pivotloc=Partition(L,low,high);/将L.rlowhigh一分为二QSort(L,low,pivotloc-1);/对低子表递归排序,pivotloc是枢轴位置QSort(L,pivotloc+1,high);/对高子表递归排序void QuickSort(SqList &L)/对顺序表L做快速排序QSort(L,1,L.length);void SelectSort(SqList &L)/对顺序表L作简单选择排序int i,j,k;for(i=1;iL.length;i+)/选择第i小的记录,并交换

8、到位k=i;for(j=i+1;jL.length;j+)/在L.riL.length中选择key最小的记录if(L.rj.keyL.rk.key)k=j;if(i!=k)/与第i个记录交换L.r0.key=L.ri.key;L.ri.key=L.rk.key;L.rk.key=L.r0.key;void OutPut(SqList L)/输出顺序表int i;for(i=1;i=L.length;i+)printf(%d ,L.ri.key);printf(n);主函数设计void main()/主程序SqList L;printf(插入排序法:n);InPut(L);/创建线性表LInse

9、rtSort(L);/对L进行插入排序OutPut(L);/输出线性表Lprintf(交换排序法:n);InPut(L);/创建线性表LQuickSort(L);/对L进行交换排序OutPut(L);/输出线性表Lprintf(选择排序法:n);InPut(L);/创建线性表LSelectSort(L);/对L进行选择排序OutPut(L);/输出线性表L四、程序调试分析 在快速排序中,对一些后引入的变量,如pivotkey没有声明,导致编译失败。在直接插入排序中,由于对程序理解不深,将if的扩错了位置,导致程序不能按预期输出。五、程序运行结果测试一:插入排序法:请输入10个数字:1 3 5

10、7 9 2 4 6 8 00 1 2 3 4 5 6 7 8 9交换排序法:请输入10个数字:1 3 5 7 9 2 4 6 8 00 1 2 3 4 5 6 7 8 9选择排序法:请输入10个数字:1 3 5 7 9 2 4 6 8 01 2 3 4 5 6 7 8 9 0测试二:插入排序法:请输入10个数字:49 38 65 97 76 13 27 67 52 3413 27 34 38 49 52 65 67 76 97交换排序法:请输入10个数字:49 38 65 97 76 13 27 67 52 3413 27 34 38 49 52 65 67 76 97选择排序法:请输入10个

11、数字:49 38 65 97 76 13 27 67 52 3413 27 38 49 52 65 67 76 97 34 六、程序清单#include #include #define MAXSIZE 15/用作示例的小顺序表的最大长度typedef structint key;/关键字项int otherinfo;/其它数据项RedType;/记录类型typedef structRedType rMAXSIZE+1;/r0闲置或用作哨兵单元int length;/顺序表长度SqList;/顺序表类型void InPut(SqList &L);void InsertSort(SqList &

12、L);void OutPut(SqList L);void QuickSort(SqList &L);void QSort(SqList &L,int low,int high);void SelectSort(SqList &L);void main()/主程序SqList L;printf(插入排序法:n);InPut(L);/创建线性表LInsertSort(L);/对L进行插入排序OutPut(L);/输出线性表Lprintf(交换排序法:n);InPut(L);/创建线性表LQuickSort(L);/对L进行交换排序OutPut(L);/输出线性表Lprintf(选择排序法:n);

13、InPut(L);/创建线性表LSelectSort(L);/对L进行选择排序OutPut(L);/输出线性表Lvoid InPut(SqList &L)/输入数字,创建顺序表int i;printf(请输入10个数字:n);L.length=10;for(i=1;i=L.length;i+)scanf(%d,&L.ri.key);void InsertSort(SqList &L)/对顺序表L作直接插入排序int i,j;for(i=2;i=L.length;i+)if(L.ri.keyL.ri-1.key)/如果“”,需将L.ri插入有序子表L.r0.key=L.ri.key;/复制为哨兵

14、L.ri.key=L.ri-1.key;for(j=i-2;L.r0.keyL.rj.key;j-)L.rj+1.key=L.rj.key;/记录后移L.rj+1.key=L.r0.key;/插入到正确位置int Partition(SqList &L,int low,int high)/交换顺序表L中子表rlowhigh的记录,枢轴记录到位,并返回其所在位置, /此时在它之前(后)的记录均不大(小)于它。int pivotkey;L.r0.key=L.rlow.key;/用子表的第一个记录作枢轴记录pivotkey=L.rlow.key;/枢轴记录关键字while(lowhigh)/从表的两

15、端交替地向中间扫描while(low=pivotkey)-high;/将比枢轴记录小的记录移到低端L.rlow.key=L.rhigh.key;while(lowhigh&L.rlow.key=pivotkey)+low;/将比枢轴记录大的记录移到高端L.rhigh.key=L.rlow.key;L.rlow.key=L.r0.key;/枢轴记录到位return low;/返回枢轴位置void QSort(SqList &L,int low,int high)/对顺序表L中的子序列L.rlowhigh作快速排序int pivotloc;if(lowhigh)/长度大于1pivotloc=Partition(L,low,high);/将L.rlowhigh一分为二QSort(L,low,pivotloc-1);/对低子表递归排序,pivotloc是枢轴位置QSort(L,pivotloc+1,high);/对高子表递归排序void QuickSort(SqList &L)/对顺序表L做快速排序QSort(L,1,L.length);void SelectSort(SqList &L)/对顺序表L作简单选择排序int i,j,k;for(i=1;iL.length;i+

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论