排序算法比较Word文档格式.docx
《排序算法比较Word文档格式.docx》由会员分享,可在线阅读,更多相关《排序算法比较Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
1.1题目分析
比较冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序等排序算法的运行速度,通过设计的程序显示各排序算法的比较次数与交换次数从而进一步分析各排序算法的优劣。
;
1.2数据结构
排序算法的比较问题中涉及的数据结构包括对冒泡函数,插入函数,选择函数,快速排序函数,希尔排序函数的定义与使用。
1.3流程图
排序算法的比较流程如图1所示:
图1 排序算法的比较流程图
1.4实现技术
为实现上述设计,采用C++语言,VS2008开发环境。
具体采用的技术如下:
(1)对函数的定义与调用
(2)各函数运行的内部比较
实现步骤如下:
(1)用随机数生成器输入你所需要的数组内数的个数。
(2)分别定义冒泡排序,插入排序,选择排序,快速排序,希尔排序函数。
(3)分别调用各个排序函数,将随机数生成器生成的数组导入各函数。
(4)运行程序,显示各函数的比较次数与交换次数,从而进行比较。
运行结果如下:
注意:
此处应采用软件截图说明!
!
输入元素个数为20
输入元素个数为100
1.5设计结论和心得
通过课程设计得到如下结论:
(1)快速排序与希尔排序的比较次数与交换次数较其他的要少。
(2)冒泡排序较其他排序相对比较麻烦。
(3)对于一般的排序,比较次数多,而交换次数相对较少;
而快速排序比较次数和交换次数都较少,两者相差不如前者大。
其中冒泡排序比较和交换次数都很大。
有如下几点心得体会:
(1)实验中的存在问题和提高,存在问题:
程序有待增强。
提高:
界面处理简洁。
(2)收获与体会
各种排序的算法,排序的算法的比较次数与移动次数的计算,随机数的生成
2Linux代码分析
为了进一步了解操作系统内核,学习了Linux操作系统的进程同步程序,主要程序源代码如下:
#include<
cstdlib>
iostream>
usingnamespacestd;
#defineLS(a,b)((a)<
(b))
#defineLL(a,b)((a)>
#defineMAXSIZE10000
typedefintKeyType;
typedefstruct{
KeyTypekey;
}RedType;
RedTyper[MAXSIZE+1];
intlength;
}SqList;
intcompare=0;
intchange=0;
intCreate_Sq(SqList&
L)
{
intk;
cout<
<
"
20074795元素个数:
;
cin>
>
k;
L.length=k;
srand(time(NULL));
for(intx=1;
x<
=k;
x++)
{
L.r[x].key=rand()%k;
//随机域为0~k
}
return1;
}
voidBubble_sort(SqList&
L)//冒泡排序
inti,j,l,k=L.length,m=0,n=0;
for(i=1;
i<
=L.length-1;
++i){
for(j=1;
j<
=k-1;
++j){
++m;
if(LL(L.r[j].key,L.r[j+1].key)){
l=L.r[j].key;
L.r[j].key=L.r[j+1].key;
L.r[j+1].key=l;
++n;
}
--k;
endl<
-----冒泡排序后的序列-----"
endl;
=L.length;
i++)
cout<
"
L.r[i].key;
冒泡排序的比较次数:
m<
冒泡排序的交换次数:
n<
}
voidInsertSort(SqList&
L)//插入排序
inti,j,m=0,n=0;
for(i=2;
++i)
if(LS(L.r[i].key,L.r[i-1].key))
L.r[0]=L.r[i];
L.r[i]=L.r[i-1];
for(j=i-2;
LS(L.r[0].key,L.r[j].key);
--j)
L.r[j+1]=L.r[j];
L.r[j+1]=L.r[0];
-----直接插入排序后的序列-----"
直接插入排序的比较次数:
直接插入排序的交换次数:
voidSelectSort(SqList&
L)//简单选择排序
intl,i,j,m=0,n=0;
L.length;
j=i+1;
l=i;
for(j;
if(LL(L.r[0].key,L.r[j].key)){
l=j;
L.r[0]=L.r[j];
if(l!
=i){
L.r[l]=L.r[i];
L.r[i]=L.r[0];
-----简单选择排序后的序列-----"
简单选择排序的比较次数:
简单选择排序的交换次数:
intPartition(SqList&
L,intlow,inthigh){
intpivotkey;
L.r[0]=L.r[low];
pivotkey=L.r[low].key;
while(low<
high){
while(low<
high&
&
L.r[high].key>
=pivotkey){
++compare;
--high;
++change;
L.r[low]=L.r[high];
L.r[low].key<
++low;
L.r[high]=L.r[low];
L.r[low]=L.r[0];
returnlow;
voidQSort(SqList&
L,intlow,inthigh)//递归形式的快速排序算法
intpivotloc;
if(low<
pivotloc=Partition(L,low,high);
QSort(L,low,pivotloc-1);
QSort(L,pivotloc+1,high);
voidQuickSort(SqList&
L){
inti;
QSort(L,1,L.length);
-----快速排序后的序列为-----"
快速排序的比较次数:
compare<
快速排序的交换次数:
change<
compare=0;
change=0;
voidShellInsert(SqList&
L,intdk)//希尔排序
intj;
for(i=dk+1;
if(LS(L.r[i].key,L.r[i-dk].key)){
for(j=i-dk;
j>
0&
j-=dk){
L.r[j+dk]=L.r[j];
L.r[j+dk]=L.r[0];
voidShellSort(SqList&
L,intdlta[])//希尔排序
intk,j=L.length/2,t=0;
while(j>
=0){
++t;
j-=2;
j=L.length/2;
for(k=0;
k<
t;
++k)//计算每次的增量值
if(j==0)
j=1;
//定义最后一趟排序的增量
dlta[k]=j;
++k)
ShellInsert(L,dlta[k]);
-----希尔排序后的序列为-----"
for(k=1;
k++)
L.r[k].key;
希尔排序的比较次数:
希尔排序的交换次数:
/*这里是改造后的main,他的原始形式是dev自动生成的
*/
intmain(intargc,char*argv[])
intdlta[MAXSIZE];
SqListL,a,b,c,d;
Create_Sq(L);
a=b=c=d=L;
Bubble_sort(L);
InsertSort(a);
SelectSort(b);
QuickSort(c);
ShellSort(d,dlta);
system("
PAUSE"
);
returnEXIT_SUCCESS;
功能说明
这一段程序的主要功能为:
(1)显示同一数组用不同的排序方法的比较次数与交换次数。
(2)比较各排序算法的优劣。
2.1局部数据结构
局部变量及数据结构,其类型定义及语义如下:
1.数据定义
2.函数如下,代码详见文件“排序比较.cpp”
L)
voidInsertSort(SqList&
voidSelectSort(SqList&
L,intlow,inthigh)
voidShellInsert(SqList&
voidShellSort(SqList&
L,intdlta[])
2.2流程图
本程序的流程图如图2所示
图2 程序流程图
2.3以实例说明运行过程
理论分析可以得出各种排序算法的时间复杂度和空间复杂度,如下表所示:
影响排序的因素:
◆待排序的记录数目n的大小。
◆记录本身数据量的大小,也就是记录中除关键字外的其他信息量的大小。
◆关键字的结构及其分布情况。
◆对排序稳定性的要求