1、北京理工大学数据结构实验报告4数据结构与算法统计实验报告 实验四学院: 班级:学号:姓名: 一、实验目的 1、熟悉VC环境,学会使用C语言利用顺序表解决实际问题。2、通过上机、编程调试,加强对线性表的理解和运用的能力。3、锻炼动手编程,独立思考的能力。二、实验内容 从键盘输入10个数,编程实现分别用插入排序、交换排序、选择排序算法进行排序,输出排序后的序列。三、程序设计 1、概要设计为了实现排序的功能,需要将输入的数字放入线性表中,进行进一步的排序操作。(1)抽象数据类型:ADT SqList 数据对象:D=数据关系:R1= 基本操作:InPut(SqList &L)操作结果:构造一个线性表L
2、。 OutPut(SqList 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)函数显示排序结果。再由主程序首
3、先调用InPut(L)函数创建顺序表,调用QuickSort(L)函数进行交换排序,调用OutPut(L)函数显示排序结果。再由主程序首先调用InPut(L)函数创建顺序表,调用SelectSort(L)函数进行选择排序,调用OutPut(L)函数显示排序结果。模块调用关系由主函数模块调用创建顺序表模块,排序模块与显示输出模块。流程图 2、详细设计 (1)数据类型设计#define MAXSIZE 15/用作示例的小顺序表的最大长度typedef struct int key;/关键字项 int otherinfo;/其它数据项RedType;/记录类型typedef struct RedTy
4、pe 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.key)/如果“”,需将L.ri插入有序子表 L.r
5、0.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;/用子表的第一个记录作枢轴记录 pivotkey=L.rlow.key
6、;/枢轴记录关键字 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作快速排序 int
7、pivotloc; if(lowhigh)/长度大于1 pivotloc=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); InP
9、ut(L);/创建线性表L InsertSort(L);/对L进行插入排序 OutPut(L);/输出线性表L printf(交换排序法:n); InPut(L);/创建线性表L QuickSort(L);/对L进行交换排序 OutPut(L);/输出线性表L printf(选择排序法:n); InPut(L);/创建线性表L SelectSort(L);/对L进行选择排序 OutPut(L);/输出线性表L四、程序调试分析 在快速排序中,对一些后引入的变量,如pivotkey没有声明,导致编译失败。 在直接插入排序中,由于对程序理解不深,将if的扩错了位置,导致程序不能按预期输出。五、程序运
10、行结果测试一:插入排序法:请输入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 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 4
11、9 52 65 67 76 97选择排序法:请输入10个数字: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 struct int key;/关键字项 int otherinfo;/其它数据项RedType;/记录类型typedef struct RedType rMAXSIZE+1;/r0闲置或用作哨兵单元 int length;/顺序表长度SqList;/顺序表类型void InPut(SqL
12、ist &L);void InsertSort(SqList &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);/创建线性表L InsertSort(L);/对L进行插入排序 OutPut(L);/输出线性表L printf(交换排序法:n); InPut(L);/创建线性表L QuickSort(L);/对
13、L进行交换排序 OutPut(L);/输出线性表L printf(选择排序法:n); InPut(L);/创建线性表L SelectSort(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;/复制为哨兵 L.ri.key=L.ri-1.key; for(j=i-2;L.r0.keyL.rj.key;j-)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1