北京理工大学数据结构实验报告4文档格式.docx
《北京理工大学数据结构实验报告4文档格式.docx》由会员分享,可在线阅读,更多相关《北京理工大学数据结构实验报告4文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
ADTSqList{
数据对象:
D=
数据关系:
R1=
基本操作:
InPut(SqList&
L)
操作结果:
构造一个线性表L。
OutPut(SqListL)
初始条件:
线性表L已存在。
按顺序在屏幕上输出L的数据元素。
InsertSort(SqList&
对L的数据元素进行插入排序。
QuickSort(SqList&
对L的数据元素进行快速排序。
SelectSort(SqList&
对L的数据元素进行选择排序。
}ADTSqList
⑵主程序流程
由主程序首先调用InPut(L)函数创建顺序表,调用InsertSort(L)函数进行插入排序,调用OutPut(L)函数显示排序结果。
再由主程序首先调用InPut(L)函数创建顺序表,调用QuickSort(L)函数进行交换排序,调用OutPut(L)函数显示排序结果。
再由主程序首先调用InPut(L)函数创建顺序表,调用SelectSort(L)函数进行选择排序,调用OutPut(L)函数显示排序结果。
⑶模块调用关系
由主函数模块调用创建顺序表模块,排序模块与显示输出模块。
⑷流程图
2、详细设计
(1)数据类型设计
#defineMAXSIZE15//用作示例的小顺序表的最大长度
typedefstruct
{
intkey;
//关键字项
intotherinfo;
//其它数据项
}RedType;
//记录类型
RedTyper[MAXSIZE+1];
//r[0]闲置或用作哨兵单元
intlength;
//顺序表长度
}SqList;
//顺序表类型
(2)操作算法设计
voidInPut(SqList&
//输入数字,创建顺序表
inti;
printf("
请输入10个数字:
\n"
);
L.length=10;
for(i=1;
i<
=L.length;
i++)
{
scanf("
%d"
&
L.r[i].key);
}
}
voidInsertSort(SqList&
//对顺序表L作直接插入排序
inti,j;
for(i=2;
if(L.r[i].key<
L.r[i-1].key)//如果“<
”,需将L.r[i]插入有序子表
{
L.r[0].key=L.r[i].key;
//复制为哨兵
L.r[i].key=L.r[i-1].key;
for(j=i-2;
L.r[0].key<
L.r[j].key;
j--)
{
L.r[j+1].key=L.r[j].key;
//记录后移
}
L.r[j+1].key=L.r[0].key;
//插入到正确位置
}
intPartition(SqList&
L,intlow,inthigh)
//交换顺序表L中子表r[low…high]的记录,枢轴记录到位,并返回其所在位置,
/此时在它之前(后)的记录均不大(小)于它。
intpivotkey;
L.r[0].key=L.r[low].key;
//用子表的第一个记录作枢轴记录
pivotkey=L.r[low].key;
//枢轴记录关键字
while(low<
high)//从表的两端交替地向中间扫描
while(low<
high&
&
L.r[high].key>
=pivotkey)
--high;
//将比枢轴记录小的记录移到低端
L.r[low].key=L.r[high].key;
L.r[low].key<
++low;
//将比枢轴记录大的记录移到高端
L.r[high].key=L.r[low].key;
L.r[low].key=L.r[0].key;
//枢轴记录到位
returnlow;
//返回枢轴位置
voidQSort(SqList&
//对顺序表L中的子序列L.r[low…high]作快速排序
intpivotloc;
if(low<
high)//长度大于1
pivotloc=Partition(L,low,high);
//将L.r[low…high]一分为二
QSort(L,low,pivotloc-1);
//对低子表递归排序,pivotloc是枢轴位置
QSort(L,pivotloc+1,high);
//对高子表递归排序
voidQuickSort(SqList&
//对顺序表L做快速排序
QSort(L,1,L.length);
voidSelectSort(SqList&
//对顺序表L作简单选择排序
inti,j,k;
L.length;
i++)//选择第i小的记录,并交换到位
k=i;
for(j=i+1;
j<
j++)//在L.r[i…L.length]中选择key最小的记录
if(L.r[j].key<
L.r[k].key)
k=j;
if(i!
=k)//与第i个记录交换
L.r[i].key=L.r[k].key;
L.r[k].key=L.r[0].key;
voidOutPut(SqListL)
//输出顺序表
printf("
%d"
L.r[i].key);
⑶主函数设计
voidmain()//主程序
SqListL;
插入排序法:
InPut(L);
//创建线性表L
InsertSort(L);
//对L进行插入排序
OutPut(L);
//输出线性表L
交换排序法:
QuickSort(L);
//对L进行交换排序
选择排序法:
SelectSort(L);
//对L进行选择排序
四、程序调试分析
⑴在快速排序中,对一些后引入的变量,如pivotkey没有声明,导致编译失败。
⑵在直接插入排序中,由于对程序理解不深,将if的{}扩错了位置,导致程序不能按预期输出。
五、程序运行结果
测试一:
1357924680
0123456789
1234567890
测试二:
49386597761327675234
13273438495265677697
13273849526567769734
六、程序清单
#include<
iostream>
stdio.h>
//顺序表类型
L);
voidOutPut(SqListL);
L,intlow,inthigh);
L)//输入数字,创建顺序表
L)//对顺序表L作直接插入排序