课程设计.docx
《课程设计.docx》由会员分享,可在线阅读,更多相关《课程设计.docx(23页珍藏版)》请在冰豆网上搜索。
课程设计
摘要
排序算法是数据结构这门课程核心内容之一,它是计算机程序设计、数据库、操作系统、编译原理级人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习排序算法是为了将实际问题中涉及的对象在计算机中对它们进处理。
我们将利用vc++6.0开发程序对各种算法进行测试。
该测试系统可以通过操作吧数据结构中的主要排序常见的排序算法(直接插入排序、希尔排序、直接选择排序、冒泡排序、快速排序、堆排序、归并排序)的性能用时间的长短表现出来。
【关键字】:
数据结构vc++6.0排序算法时间长短
一、任务描述
使用简单数组实现下面各种排序算法,并进行比较。
1、插入排序
2、希尔排序
3、冒泡排序
4、快速排序
5、简单选择排序
1.要求:
1、测试数据分成三类:
正序、逆序、随机数据
2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换计为3次移动)。
3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒(选作)
4、对2和3的结果进行分析,验证上述各种算法的时间复杂度
编写测试main()函数测试线性表的正确性。
二、程序分析
图2-1程序分析
(1)设计一个菜单,格式如下:
1、直接插入排序2、希尔排序3、冒泡排序4、快速排序
5、选择排序6、堆排序7、退出
(2)选择不同的菜单但进行相应的排序,并给出排序的关键字序列。
三、存储结构关键算法分析
本程序包含了9个函数,它们分别是:
1.直接插入排序的算法函数InsertSort()。
voidInsertSort(SqList&L)
{
inti,j;
for(i=2;i<=L.length;i++)
{
if(L.r[i].key{
L.r[0]=L.r[i];
L.r[i]=L.r[i-1];
for(j=i-2;(L.r[0].keyL.r[j+1]=L.r[0];
}
}
}
2.希尔排序的算法函数ShellSort()。
voidShellSort(SqList&L)
{
inti,j;
intdk=1;//增量
while(dk<=L.length/3)
dk=3*dk+1;//增大增量
while(dk>0)
{
dk/=3;//减小增量
for(i=dk;i<=L.length;i++){
L.r[0].key=L.r[i].key;
j=i;
while((j>=dk)&&(L.r[j-dk].key>L.r[0].key)){
L.r[j].key=L.r[j-dk].key;
j-=dk;
}
L.r[j].key=L.r[0].key;
}
}
}
3.冒泡排序算法函数BubbleSort()。
voidBubbleSort(SqList&L)
{
inti,j;
for(i=0;i{
intflag=1;
for(j=0;jif(L.r[j].key>L.r[j+1].key)
{
flag=0;
inttemp;
temp=L.r[j].key;
L.r[j].key=L.r[j+1].key;
L.r[j+1].key=temp;
}
//若无交换说明已经有序
if(flag==1)
break;
}}
4.快速排序的算法函数Partition()。
voidBubbleSort(SqList&L)
{
inti,j;
for(i=0;i{
intflag=1;
for(j=0;jif(L.r[j].key>L.r[j+1].key)
{
flag=0;
inttemp;
temp=L.r[j].key;
L.r[j].key=L.r[j+1].key;
L.r[j+1].key=temp;
}
//若无交换说明已经有序
if(flag==1)
break;
}}
5.选择排序算法函数SelectSort()。
voidSelectSort(SqList&L)
{
intmin;
intj;
for(inti=0;i{//选择第i小的记录,并交换
j=i;
min=L.r[i].key;
for(intk=i;k{//在R[i..n-1]中选择最小的记录
if(L.r[k].key{
min=L.r[k].key;
j=k;
}
}
if(i!
=j)
{//与第i个记录交换
inttemp=L.r[i].key;
L.r[i].key=L.r[j].key;
L.r[j].key=temp;
}
}
}
6.堆排序算法函数HeapAdjust()。
voidHeapAdjust(HeapType&H,ints,intm)
//堆调整,将记录调整为小顶堆intj;
RedTyperc=H.r[s];//暂时存储根结点
for(j=2*s;j<=m;j*=2)
{
//沿着结点记录较小的向下筛选
if(j++j;
if(rc.key>=H.r[j].key)
break;
H.r[s]=H.r[j];
s=j;
}
H.r[s]=rc;
}
voidHeapSort(HeapType&H)
{
inti;
RedTypetemp;
for(i=H.length;i>0;--i)
HeapAdjust(H,i,H.length);
for(i=H.length;i>1;--i)
{
temp=H.r[1];
H.r[1]=H.r[i];
H.r[i]=temp;
HeapAdjust(H,1,i-1);
}
7.对存储数字的遍历函数
voidVisit(SqListL)
{
for(inti=1;i<=L.length;i++)
cout<cout<}
voidInitSqList(SqList&L,inta[])
{
for(inti=1;i<=L.length;i++)
L.r[i].key=a[i];
}
8.主函数main()。
关键算法的时间、空间复杂度:
排序法 平均时间 最差情形 稳定度 额外空间 备注
冒泡 O(n2) O(n2) 稳定 O
(1) n小时较好
交换 O(n2) O(n2) 不稳定 O
(1) n小时较好
选择 O(n2) O(n2) 不稳定 O
(1) n小时较好
插入 O(n2) O(n2) 稳定 O
(1) 大部分已排序时较好
Shell O(nlogn) O(ns)1
(1) s是所选分组
快速 O(nlogn) O(n2) 不稳定 O(nlogn) n大时较好
归并 O(nlogn) O(nlogn) 稳定 O
(1) n大时较好
堆 O(nlogn) O(nlogn) 不稳定 O
(1) n大时较好
四、主函数流程:
图4-1主函数流程
五、程序运行结果
1.正序输入
图5-1正序输入
2.反序输入
图5-2反序输入
3.随机输入
图5-3随机输入
参考文献
[1]数据结构(C语言版)高等教育出版社胡学纲编著
[2]数据结构与算法高等教育出版社许卓群、杨东青编著
[3]新编考研辅导丛书数据结构辅导西安电子科技大学出版社王卫东编著
[4]数据结构人民邮电出版社刘遵仁编著
[5]数据结构(C语言版)导教、导学、导考西北工业大学出版社姚群、夏清国编著
[6]数据结构(C语言描述)清华大学出版社徐孝凯、贺桂英编著
[7]数据结构(C语言描述)学习指导与习题解析清华大学出版社徐孝凯、贺桂英编著
[8]数据结构(含实训)东南大学出版社齐景嘉编著
[9]数据结构红旗出版社张曼、朱小谷等编著
[10]数据结构习题解析清华大学出版社李春葆编著
[11]数据结构常见题型解析与模拟题西北工业大学出版社朱儒荣、朱辉编著
[12]数据结构习题集与解题指导科学技术文献出版社薛晓燕、王晓冬编著
[13]数据结构(C语言描述)清华大学出版社徐孝凯、贺桂英编著
附录(程序清单)
#include
#include
#include
usingnamespacestd;
inti,j,temp,k;//设置全局变量
longdoubleGetNowTime()//取系统时间
{
LARGE_INTEGERlitmp;
LONG64QPart;
QueryPerformanceCounter(&litmp);
QPart=litmp.QuadPart;
return(longdouble)QPart;
}
//插入排序
voidInsertSort(intr[],intn)
{intmove=0,compare=0;
longdoublestart=0,end=0,time=0;
start=GetNowTime();
for(i=2;i{
if(r[i]{compare++;
r[0]=r[i];//设置哨兵,存放待排序记录值
for(j=i-1;r[0]r[j+1]=r[j];//比r[0]大的往后移
r[j+1]=r[0];//插入指定记录值
move=move+3;//关键码的交换按3次记
compare++;
}
}
end=GetNowTime();
time=end-start;
for(k=1;kcout<cout<cout<<"排序所需时间:
"<