《数据结构》课程设计报告Word文件下载.docx
- 文档编号:22823757
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:23
- 大小:23.03KB
《数据结构》课程设计报告Word文件下载.docx
《《数据结构》课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《《数据结构》课程设计报告Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。
进度安排:
为第一次实验课将6个内排序算法完成并调试成功,周末之前完成界面控制并对排序结果进行分析,第二次实验之前完成课程设计报告,第二次试验对程序结果进行最后检查并提交实验报告。
数据结构选择(包括改进或给出):
使用数组作为本实验基本的数据结构,数据类中包含有数组的头指针head,在初始化时动态申请数组空间,此外还有count(整型)用于记录数组个数,同时可以对数组进行6种内排序及显示数组元素的操作。
算法设计:
借助课本与网络,使用C++编写算法,详细请看后面程序清单。
编程与程序清单:
1.//头文件data.h
2.//文件数据类Data定义
3.//起泡排序(升序)
4.//直接插入排序(升序)
5.//简单选择排序(升序)
6.//快速排序(升序)
7.//快速排序的递归函数
8.//希尔排序(升序)
9.//插入排序(升序)
10.//堆排序(升序)
11.//控制类
12.//功能选择
13.//主函数
1.//头文件data.h
#ifndefDATA_H_INCLUDED
#defineDATA_H_INCLUDED
#include<
ctime>
iostream>
usingnamespacestd;
template<
classT>
classData
{
private:
T*head;
//数据数组指针,用于动态申请数组空间
intcount;
//数组大小
public:
//构造函数,使指针为空
Data(){head=NULL;
}
//用已有数组构造数组元素,当前程序使用该函数来构造数据元素
voidcopy(T*h,intc=1000)
{
if(head!
=NULL)
delete[]head;
head=h;
count=c;
head=newT[count];
for(inti=0;
i<
count;
i++)
head[i]=h[i];
}
//手动输入各元素,当前程序未使用,调试程序时使用!
voidset()
cout<
<
"
请输入数据个数:
endl;
cin>
>
请输入数据:
head[i];
//析构函数,回收空间
~Data(){delete[]head;
voidbSort()
if(isEmpty()){cout<
文件中无记录,无法排序!
return;
intcompareTime=0;
//关键词比较次数
intmoveTime=0;
//关键词移动次数
intbound=count;
intstart,finish;
//记录程序运行时间
Ttemp;
正在排序..."
start=clock();
//记录初始时间
//算法主体
while(bound!
=0)
intt=0;
bound-1;
compareTime++;
if(head[i]>
head[i+1])
temp=head[i];
head[i]=head[i+1];
head[i+1]=temp;
t=i+1;
moveTime+=3;
//记录交换一次移动次数加3
bound=t;
finish=clock();
>
排序后结果为:
display();
//输出排序后序列
endl<
*-------------------------------"
endl
<
*关键词比较次数:
compareTime<
*记录移动次数:
moveTime<
*排序执行时间:
finish-start<
ms"
4.//直接插入排序(升序)
voidiSort()
longstart,finish;
for(inti=1;
intj;
j=i-1;
moveTime++;
//无记录交换,仅有向辅存中移动,故移动次数加1
while(j>
=0&
&
head[j]>
temp)
head[j+1]=head[j];
//记录向后移一位,移动次数加1
j--;
//跳出循环后比较次数要再加1
head[j+1]=temp;
(finish-start)<
5.//简单选择排序(升序)
voidsSort()
count-1;
intj=i;
for(intk=i+1;
k<
k++)
if(head[j]>
head[k])
j=k;
//标记当前最大的记录下标
if(i!
=j)
head[i]=head[j];
head[j]=temp;
6.//快速排序(升序)
voidqqSort()
inttimes[2]={0,0};
//要调用函数,故使用数组来记录关键词的比较次数和移动次数,直接进行计数
qSort(head,0,count,times);
//一趟快速排序函数
times[0]<
times[1]<
7.//快速排序的递归函数
voidqSort(T*head,intm,intn,int*times)
inti=m,j=n;
Ttemp=head[m],t=m;
if(m<
n)//递归出口(m>
=n)
while(i<
j)
i=i+1;
while(head[i]<
temp&
i!
=n){times[0]++;
i++;
j=j-1;
while(head[j]>
j!
=m){times[0]++;
j--;
if(i<
t=head[i];
head[j]=t;
times[1]+=3;
if(m!
t=head[m];
head[m]=head[j];
qSort(head,m,j,times);
qSort(head,j+1,n,times);
8.//希尔排序(升序)
voidshell()
intseq[8]={701,301,132,57,23,10,4,1};
//依据课本得到希尔排序最优的增量递减序列
intn;
8;
n=seq[i];
insert(n,times);
//调用插入排序算法对同组数据进行排序
9.//插入排序(被希尔排序shell函数调用)
voidinsert(intn,int*times)
//增量为n带来一系列程序的改动
for(intk=0;
k+n<
k++)
for(inti=k+n;
i+=n)
j=i-n;
times[1]++;
=k&
times[0]++;
head[j+n]=head[j];
j-=n;
head[j+n]=temp;
10.//堆排序(升序)
voidhSort()
//堆为完全二叉树,故可用数组构造堆,且不会造成空间的浪费
//初始建堆
for(inti=count/2;
i>
0;
i--)
restore(i,count,times);
//排序及重建堆
for(inti=count;
1;
temp=head[0];
head[0]=head[i-1];
head[i-1]=temp;
restore(1,i-1,times);
//重建堆算法(被堆排序hSort函数调用)
voidrestore(inta,intb,int*times)
intmark,j=a;
while(j<
=b/2)
if(2*j<
b&
head[2*j-1]<
head[2*j])
mark=2*j;
else
mark=2*j-1;
if(head[mark]>
head[j-1])
temp=head[mark];
head[mark]=head[j-1];
head[j-1]=temp;
j=mark+1;
j=b;
//人为改变j的值,跳出循环,退出程序
//输出记录序列(升序)
voiddisplay()
head[i]<
"
;
//判断数据是否为空
boolisEmpty()const{returnhead==NULL;
//获得头指针,本程序未使用!
T*getHead(){returnhead;
//获得数组元素个数,本程序未使用!
intgetCount()const{returncount;
};
#endif//DATA_H_INCLUDED
//头文件control.h
#ifndefCONTROL_H_INCLUDED
#defineCONTROL_H_INCLUDED
#include"
data.h"
sstream>
//含有istringstream类
fstream>
11.//控制类,进行界面管理,记录文件读取,调用排序函数等操作
classControl
voidconmain()//控制函数
################################################################################"
#################【数据结构课程设计
(一):
内排序算法比较】###################"
##################################################################################"
#使用说明:
运行程序,请输入数据文件名(a.txt,b.txt,c.txt均为无序数据,d.txt为完#"
#全正序数据,e.txt为完全逆序文件,均存放在当前目录下),之后请按照用户个人需求#"
#选择相应功能!
#"
################################"
#>
功能列表#"
#1.起泡排序(升序)#"
#2.直接插入排序(升序)#"
#3.简单选择排序(升序)#"
#4.快速排序(升序)#"
#5.希尔排序(升序)#"
#6.堆排序(升序)#"
#0.退出#"
//定义选择变量及辅助变量
intopt1,a,i=0;
//数组存储数据
intdata[1000];
//定义Data类对象
Data<
int>
temp;
//文件名
stringfile;
//读取文件,从输入的文件名中读取数据,a.txt,b.txt,c.txt为随机数据,e.txt为正序,e.txt为逆序
请输入目标数据文件:
file;
ifstreamin(file.c_str());
//string类转换为字符串且在末尾加'
\0'
for(strings;
getline(in,s);
)//读取文件,读取整行,使用istringstream类读出数字(可自动忽略数字间的空格)
for(istringstreamsin(s);
sin>
a;
);
data[i++]=a;
12.//功能选择
请选择功能(输入对应功能的序号):
opt1;
while(opt1)
switch(opt1)
{
//调用起泡排序函数
case1:
temp.copy(data);
temp.bSort();
break;
//调用直接插入排序函数
case2:
temp.iSort();
//调用简单选择排序函数
case3:
temp.sSort();
//调用快速排序函数
case4:
temp.qqSort();
//调用Shell排序函数
case5:
temp.shell();
//调用堆排序函数
case6:
temp.hSort();
<
|<
您的输入有误,请再次输入!
|"
------------------------------"
}
#4
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告
