排序算法的比较 C++Word文档下载推荐.docx
- 文档编号:19810232
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:25
- 大小:81.50KB
排序算法的比较 C++Word文档下载推荐.docx
《排序算法的比较 C++Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《排序算法的比较 C++Word文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。
3.4.2关键算法分析
关键算法1
实现四种算法的基本排序功能
1.冒泡排序:
两两比较相邻记录的关键码,如果反序则交换,直到没有反序记录为止。
实现过程(如图2)。
对于数组(2125491608)。
初态:
21
25
49
16
08
第一趟:
第二趟:
第三趟:
第四趟:
图2
2.选择排序:
从待排序的记录序列中选择关键码最小(或最大)的记录并将它与序列中的第一个记录交换位置;
然后从不包括第一个位置上的记录序列中选择关键码最小(或最大)的记录并将它与序列中的第二个记录交换位置;
如此重复,直到序列中只剩下一个记录为止。
实现过程(如图3)。
图3
3.直接插入排序:
依次将待排序的序列中的每一个记录插入到先前排序好的序列中,直到全部记录排序完毕。
实现过程(如图4)。
第五趟:
图4
4.快速排序:
首先选择一个基准,将记录分割为两部分,左支小于或等于基准,右支则大于基准,然后对两部分重复上述过程,直至整个序列排序完成。
实现过程(如图5)
R[0]=21
high
low
low
R[0]=21
low=high
图5
关键算法二
获取当前系统时间,精确到毫秒,分别在代码运行前后调用记录前后时间,再相减即可得到代码运行时间。
//以冒泡排序为例
start=(double)clock();
//开始
Bubblesort(R,n);
end=(double)clock();
//结束
Time=(double)(end-start)/CLK_TCK;
//相减,精确到毫秒
关键算法三:
实现手动与计算机随机双重输入。
手动输入检查程序的正确性,计算机随即输入,可以比较各排序算法的性能。
voidRand()//随机数函数
voidHandInput()//手动输入函数
关键算法四
纠错功能。
在用户输入非法数据时,给予警告,并要求用户重新输入,不必重启程序。
3.4.3时间复杂度与空间复杂度:
理论分析可以得出各种排序算法的时间复杂度和空间复杂度,如下表所示(图6):
排序方法
平均情况
最好情况
最坏情况
辅助空间
直接插入排序
O(n2)
O(n)
O
(1)
起泡排序
O(n)
快速排序
O(nlog2n)
O(log2n)~O(n)
简单选择排序
图6
3.4.4选择排序算法的依据
影响排序的因素有很多,平均时间复杂度低的算法并不一定就是最优的。
相反,有时平均时间复杂度高的算法可能更适合某些特殊情况。
同时,选择算法还得考虑它的可读性,以利于软件的维护。
一般而言,需要考虑的因素有以下4点:
◆待排序的记录数目n的大小。
◆记录本身数据量的大小,也就是记录中除关键字外的其他信息量的大小。
◆关键字的结构及其分布情况。
◆对排序稳定性的要求。
3.5程序流程图
图7
3.6运行环境
MicrosoftVisualC++6.0/WIN32ConsoleApplication
3.7运行结果
3.7.1当手动输入五个数据时,运行结果(如图8)
图8
3.7.2当选择随机数时,运行结果(如图9)
图9
3.8得意之处
得意之处1
将时间精确到毫秒,使得实验结果更容易观察比较。
代码如下(冒泡排序为例):
degree=Bubblesort(R,n);
Time=(double)(end-start)/;
其中CLK_TCK值为1000,即将时间精确到毫秒(图10)。
图10
得意之处2
将排序过程的每一趟输出,并且将已排好序的用中括号括起来,这样以来,可以直接看出排序过程是否正确以及深入了解排序过程的每一步。
如:
对于冒泡排序(图11)
图11
得意之处3
冒泡排序算法中,运用做标记的方法,使得排序得到正确结果后,便停止做不必要的循环。
代码如下
while(i>
1)
{
longlastExchangeIndex=1;
//表示已经有序
for(longj=1;
j<
i;
j++)
if(R[j+1]<
R[j])
{
longt=R[j];
R[j]=R[j+1];
R[j+1]=t;
BT++;
lastExchangeIndex=j;
//记下进行的位置
}
i=lastExchangeIndex;
//本趟进行过交换的最后一个记录的位置
}
4课程设计中目前存在问题
1.交换次数统计不够精确。
2.无论时间还是移动次数,应该有一个对比结果,不能只是罗列出来。
3.对于快速排序,存在两个问题。
其一,不能两边同时进行排序,使得排序趟数增加;
其二,没能格式化输出,使得输出不清晰,不美观。
5自我感受
1.在初期构思代码的时候,首先构造了各种算法的基本实现代码,已经能够实现四种排序的基本功能,并且测试无误。
后来考虑能否优化本程序,首先考虑到测试算法的需求,需要大量随机数,因为增添了随机函数发生函数,满足各种测试条件的需求。
之后考虑如何能简化代码以实现多达四种排序算法的简单调用和性能指标统计、算法时间的精确而简易的统计、算法移动次数和比较次数的精确统计。
调用精确的系统函数实现时间的统计。
此外还添加了一系列优化,使得程序的结构变得更加合理,版面风格也变得好看,可读性增强。
2.程序的优化是一个艰辛的过程,如果只是实现一般的功能,将变得容易很多,当加上优化,不论是效率还是结构优化,都需要精心设计。
这次做优化的过程中,遇到不少阻力。
因而以后要多花力气学习C++编程语言,必须要加强这方面的训练,这样才能在将编程思想和数据结构转换为代码的时候能得心应手。
3.这次课设通过在网上查阅大量资料、程序以及一些学术论文,很好的对内排序算法进行了研究,特别对数据结构这门课所学到的内容付诸于实践,加深了理解。
另外,还学到了一写别的方面的知识。
这次课设做还有许多没有考虑周到的地方,希望老师指出。
6参考文献
[1]严蔚敏吴伟民,数据结构(C语言版),北京:
清华大学出版社,2007。
[2]汪祖柱沈晓潞,基于C语言实现的若干排序算法和分析,安徽电气工程职业学院学报,第九卷第一期。
[3]王莉,常用内部排序算法的比较与选择,软件导刊,2006年1月号。
[4]赵延惠,排序方法及效率浅析,思茅师范高等专科学校学报,第18卷
附录:
程序
#include<
iostream>
#include<
stdio.h>
stdlib.h>
time.h>
iomanip>
#defineMAX100000000
usingnamespacestd;
voidprint(longR[],longn)
{
for(inti=1;
i<
=n;
i++)
cout<
<
setw(4)<
R[i];
//------------------------------------------------------------------------------
//冒泡排序
longBubblesort(longR[],longn)
{
longy=1;
longi,BT=0;
i=n;
while(i>
cout<
"
第"
y<
趟:
;
y++;
for(longx=1;
x<
=i;
x++)
cout<
R[x];
setw(3)<
["
R[i+1];
for(x=i+2;
x++)
cout<
]"
endl;
}
returnBT;
//选择排序
//staticlongST=0;
longSelectMinKey(longR[],longi,longn)//在R[i..R.length]中选择关键字最小的记录
longtemp=i;
//记录最小的元素值的位置
for(intj=i;
{
if(R[temp]>
temp=j;
//ST++;
}
returntemp;
longselectsort(longR[],longn)
longj,i,t;
longy=1;
intST=0;
for(i=1;
n;
j=SelectMinKey(R,i,n);
//在L.r[i..L.length]中选择关键字最小的记录
if(i!
=j)//与第i个记录交换
t=R[i];
R[i]=R[j];
R[j]=t;
ST++;
'
'
for(x=i+2;
//print(R,n);
returnST;
//------------------------------------------------------------------------------
//直接插入排序
longinsertsort(longR[],longn)
longIT=0,j;
for(longi=2;
++i)
if(R[i]<
R[i-1])
R[0]=R[i];
//复制为哨兵
IT=IT+1;
for(j=i-1;
R[0]<
R[j];
--j)
{
R[j+1]=R[j];
//记录后移
IT=IT+1;
}
R[j+1]=R[0];
//插入到正确位置
R[1];
for(longx=2;
for(x=i+1;
returnIT;
//快速排序
staticlongQT=0;
intPartition(longR[],longlow,longhigh,longn)
R[0]=R[low];
longpivotkey=R[low];
//枢轴
QT=QT+2;
while(low<
high)
while(low<
high&
&
R[high]>
=pivotkey)//从右向左搜索
--high;
R[low]=R[high];
QT=QT+1;
while(low<
high&
R[low]<
=pivotkey)//从左向右搜索
++low;
R[high]=R[low];
QT=QT+1;
R[low]=R[0];
returnlow;
}//Partition
voidquicksort(longR[],intlow,inthigh,longn,longy)//对记录序列L.r[low..high]进行快速排序
if(low<
high)//长度大于1
{
longpivotloc=Partition(R,low,high,n);
//对L.r[low..high]进行一次划分
print(R,pivotloc-1);
setw
(2)<
R[pivotloc];
for(longx=pivotloc+1;
setw(5)<
quicksort(R,low,pivotloc-1,n,y);
//对低子序列递归排序
quicksort(R,pivotloc+1,high,n,y);
//对高子序列递归排序
}//QSort
voidQuickSort(longR[],longn)
quicksort(R,1,n,n,y);
//操作选择函数
voidoperate(longa[],longn)
voidmain();
long*R=newlong[n];
time_tstart,end;
//定义两个变量
doubleTime;
//排序时间
longdegree;
//排序次数
charch;
cout<
"
请选择排序算法:
\t"
cin>
>
ch;
switch(ch){
case'
1'
:
\n'
\t==您选择的是冒泡排序=="
for(inti=1;
i<
i++)//将随机数付给R[i]
R[i]=a[i];
start=(double)clock();
//print(R,n);
cout<
冒泡排序所用时间:
<
Time<
冒泡排序交换次数:
degree<
operate(a,n);
break;
2'
\t==您选择的是选择排序=="
=n;
i++)
degree=selectsort(R,n);
选择排序所用时间:
选择排序交换次数:
3'
\t==您选择的是直接插入排序=="
for(inti=1;
i<
s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 排序算法的比较 C+ 排序 算法 比较