排序综合实验报告Word格式.docx
- 文档编号:17762836
- 上传时间:2022-12-09
- 格式:DOCX
- 页数:16
- 大小:37.43KB
排序综合实验报告Word格式.docx
《排序综合实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《排序综合实验报告Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
CPU
(英特尔)Intel(R)Core(TM)i5CPUM480@2.67GHz
姓名
xx
内存
4.00GB(金士顿PC3-10600DDR31333MHz)
学号
xxxxxxxxxx
主板
宏碁JE40_CP
班级
10电信1班
操作系统
MicrosoftWindows7旗舰版(64位/ServicePack1)
电话
xxxxxxxxxxxxx
编译软件
VisualC++6.0
609803959@
10^4
2*10^4
10^5
2*10^5
10^6
2*10^6
10^7
2*10^7
10^8
正序
逆序
直接插入
(带监视哨)
C
24.874
100.158
2500.3
9995.6
0.099999
5000.05
t(时间)
0.156
0.546
13.391
53.417
>
5min
27.486
(无监视哨)
4999.95
t
0.578
14.21
56.715
29.137
希尔排序
0.261664
0.598651
4.29106
9.60946
70.5165
166.929
1084.56
2461.37
17159.6
1.50001
2.24458
0.015
0.016
0.047
0.109
0.717
1.591
11.544
27.735
208.722
0.02
直接选择
0.218
0.78
19.367
77.32
19.751
20.249
冒泡(上升)
49.9905
199.985
4999.94
19999.9
0.452
1.825
45.542
182.678
47.326
冒泡(下沉)
49.9904
199.96
4999.78
0.483
1.902
47.239
189.081
47.503
快速(递归)
0.170775
0.361618
2.17042
4.79646
25.8125
57.6668
320.86
647.454
3493.6
2201.3
2201.4
0.01
0.031
0.062
0.219
0.484
2.577
5.297
29.377
18.026
18.195
堆排序
(非递归)
0.235479
0.510793
3.01938
6.43895
36.7932
77.5876
434.639
909.281
5012.88
3.11252
2.92664
0.094
0.499
0.968
7.223
17.093
123.429
0.04
0.05
(递归)
0.078
0.125
0.903
13.659
31.742
235.346
0.06
0.07
二路归并
0.123676
0.267361
1.56651
3.33305
18.7166
39.4319
224.002
468.006
2540.15
0.877986
0.815024
0.046
0.25
3.017
6.457
35.309
0.03
实验结果原因分析和结论:
1.插入、冒泡排序的速度较慢,但参加排序的序列局部或整体有序时,这种排序能达到较快的速度。
反而在这种情况下,快速排序反而慢了。
当n较小时,对稳定性不作要求时宜用选择排序,对稳定性有要求时宜用插入或冒泡排序。
若待排序的记录的关键字在一个明显有限范围内时,且空间允许是用桶排序。
当n较大时,关键字元素比较随机,对稳定性没要求宜用快速排序。
当n较大时,关键字元素可能出现本身是有序的,对稳定性有要求时,空间允许的情况下。
宜用归并排序。
当n较大时,关键字元素可能出现本身是有序的,对稳定性没有要求时宜用堆排序。
2.插入排序、冒泡排序、选择排序的时间复杂性为O(n2)
其它非线形排序的时间复杂性为O(nlog2n)
线形排序的时间复杂性为O(n);
3.在算法运行期间,运行QQ软件、360安全卫士、360杀毒、word文档、ppt、酷狗等软件会影响绝对时间和逻辑时间,使时间增大
4.随着n的取值增大,算法的实际时间增长速度逐渐增大。
5.直接插入排序(有、无监视哨)、冒泡排序(上升、下沉)、堆排序(递归、非递归)的关键字比较次数相同,但绝对时间相差比较大;
直接选择排序与冒泡排序的关键字比较次数相近。
6.相比较其他同学的数据,直接插入(有、无监视哨),直接选择,冒泡(上升、下沉)的结果相差较小,希尔选择结果相差很大,另快速(递归),堆(递归,非递归),二路归并(非递归)结果并不会受计算机环境而不同。
附录:
源程序极其代码
#defineCPPC++
#defineMPPM++
#defineMP2M+=2
#defineMP3M+=3
#include<
fstream.h>
iomanip.h>
stdlib.h>
time.h>
math.h>
constintmaxsize=20000;
//排序表容量
typedefintdatatype;
typedefstruct{
datatypekey;
//关键字域
//othertypeother;
//其它域
}rectype;
//记录类型
typedefrectypelist[maxsize+2];
//排序表类型,0号单元不用
__int64C,M;
//比较和移动次数
voidcheck(listR,intn){//检验排序结果
inti;
for(i=2;
i<
=n;
i++)
if(R[i].key<
R[i-1].key){cout<
<
"
Error!
\n"
;
return;
}
cout<
Correct!
"
voiddisp(listR,intn){//显示排序后的结果
for(i=1;
i++){
setw(4)<
R[i].key<
//if(i%20==0)cout<
endl;
}
voidInsertSort1(listR,intn){//直接插入排序,带监视哨(并不改变关键字次数)
inti,j;
i++){//依次插入R[2],R[3],…,R[n]
if(CPP,R[i].key>
=R[i-1].key)continue;
//R[i]大于有序区最后一个记录,则本趟不需插入
MPP,R[0]=R[i];
//R[0]是监视哨
j=i-1;
do{//查找R[i]的插入位置
MPP,R[j+1]=R[j];
j--;
//记录后移,继续向前搜索
}while(CPP,R[0].key<
R[j].key);
MPP,R[j+1]=R[0];
//插入R[i]
voidInsertSort2(listR,intn){//直接插入排序,无监视哨
rectypex;
//x为辅助量(用R[0]代替时间变长)
i++){//进行n-1次插入
MPP,x=R[i];
//待排记录暂存到x
do{//顺序比较和移动
}while(j>
=1&
&
(CPP,x.key<
R[j].key));
MPP,R[j+1]=x;
voidShellSort1(listR,intn){//一趟插入排序,h为本趟增量
inth,i,j,k;
for(h=n/2;
h>
=1;
h=h/2){
=h;
i++){//i为组号
for(j=i+h;
j<
j+=h){//每组从第2个记录开始插入
if(CPP,R[j].key>
=R[j-h].key)continue;
//R[j]大于有序区最后一个记录,
//则不需要插入
MPP,R[0]=R[j];
//R[0]保存待插入记录,但不是监视哨
k=j-h;
//待插记录的前一个记录
do{//查找正确的插入位置
MPP,R[k+h]=R[k];
k=k-h;
//后移记录,继续向前搜索
}while(k>
0&
(CPP,R[0].key<
R[k].key));
MPP,R[k+h]=R[0];
//插入R[j]
}
if(h==1)break;
}
voidSelectSort1(listR,intn){
inti,j,k;
=n-1;
i++){//n-1趟排序
k=i;
for(j=i+1;
j++)//在当前无序区从前向后找键值最小的记录R[k]
if(R[j].key<
R[k].key)k=j;
if(k!
=i){R[0]=R[i];
R[i]=R[k];
R[k]=R[0];
}//交换R[i]和R[0],R[0]作辅助量
voidBubbleSort1(listR,intn){//上升法冒泡排序
inti,j,flag;
//x为辅助量(可用R[0]代替)
i++){//做n-1趟扫描
flag=0;
//置未交换标志
for(j=n;
j>
=i+1;
j--)//从下向上扫描
if(CPP,R[j].key<
R[j-1].key){//交换记录
flag=1;
MP3,x=R[j];
R[j]=R[j-1];
R[j-1]=x;
//交换
if(!
flag)break;
//本趟未交换过记录,排序结束
voidBubbleSort2(listR,intn){//下沉法,冒泡排序
for(j=1;
=n-i;
j++)//从上向下扫描
if(CPP,R[j].key>
R[j+1].key){//交换记录
R[j]=R[j+1];
R[j+1]=x;
intPartition(listR,intp,intq){//对R[p]到R[q]划分,返回基准位置
//辅助量(可用R[0]代替)
i=p;
j=q;
MPP,x=R[p];
//x存基准(无序区第一个记录)
do{
while((CPP,R[j].key>
=x.key)&
i<
j)j--;
//从右向左扫描(取消=变快)
if(i<
j){MPP,R[i]=R[j];
i++;
}//交换R[i]和R[j]
while((CPP,R[i].key<
j)i++;
//从左向右扫描
j){MPP,R[j]=R[i];
}while(i<
j);
MPP,R[i]=x;
//基准移到最终位置
returni;
//最后i=j
voidQuickSort1(listR,ints,intt){//对R[s]到R[t]快速排序,递归算法m
if(s>
=t)return;
//只有一个记录或无记录时无需排序
i=Partition(R,s,t);
//对R[s]到R[t]做划分
QuickSort1(R,s,i-1);
//递归处理左区间
QuickSort1(R,i+1,t);
//递归处理右区间
voidSift1(listR,intp,intq){//堆范围为R[p]~R[q],调整R[p]为堆,非递归算法
intj;
MPP,R[0]=R[p];
//R[0]作辅助量
j=2*p;
//j指向R[p]的左孩子
while(j<
=q){
if(j<
q&
(CPP,R[j].key<
R[j+1].key))j++;
//j指向R[p]的右孩子
if(CPP,R[0].key>
=R[j].key)break;
//根结点键值大于孩子结点,已经是堆,调整结束
MPP,R[p]=R[j];
//将R[j]换到双亲位置上
p=j;
//修改当前被调整结点
MPP,R[p]=R[0];
//原根结点放入正确位置
voidSift2(listR,intp,intq){//堆范围为R[p]~R[q],调整R[p]为堆,递归算法
if(p>
=q)return;
//只有一个元素或无元素
if(j>
q)return;
if(CPP,R[p].key>
=R[j].key)return;
//根结点关键字已最大
MPP,R[0]=R[j];
//交换R[j]和R[p],R[0]作辅助量
MPP,R[j]=R[p];
Sift2(R,j,q);
//递归
voidHeadSort1(listR,intn){//堆R[1]到R[n]进行堆排序
inti;
for(i=n/2;
i>
i--)Sift1(R,i,n);
//建初始堆
for(i=n;
=2;
i--){//进行n-1趟堆排序
MPP,R[0]=R[1];
//堆顶和当前堆底交换,R[0]作辅助量
MPP,R[1]=R[i];
MPP,R[i]=R[0];
Sift1(R,1,i-1);
//R[1]到R[i-1]重建成新堆
voidHeadSort2(listR,intn){//堆R[1]到R[n]进行堆排序
i--)Sift2(R,i,n);
Sift2(R,1,i-1);
voidMerge(listR,listR1,intlow,intmid,inthigh){
//合并R的两个子表:
R[low]~R[mid]、R[mid+1]~R[high],结果在R1中
i=low;
j=mid+1;
k=low;
while(i<
=mid&
j<
=high)
if(CPP,R[i].key<
=R[j].key)MPP,R1[k++]=R[i++];
//取小者复制
elseMPP,R1[k++]=R[j++];
=mid)MPP,R1[k++]=R[i++];
//复制左子表的剩余记录
while(j<
=high)MPP,R1[k++]=R[j++];
//复制右子表的剩余记录
voidMergePass(listR,listR1,intn,intlen){//对R做一趟归并,结果在R1中
i=1;
//i指向第一对子表的起始点
while(i+2*len-1<
=n){//归并长度为len的两个子表
Merge(R,R1,i,i+len-1,i+2*len-1);
i=i+2*len;
//i指向下一对子表起始点
if(i+len-1<
n)//剩下两个子表,其中一个长度小于len
Merge(R,R1,i,i+len-1,n);
else//子表个数为奇数,剩一段
for(j=i;
j++)//将最后一个子表复制到R1中
MPP,R1[j]=R[j];
voidMergeSort(listR,listR1,intn){//对R二路归并排序,结果在R中(非递归算法)
intlen;
len=1;
while(len<
n){
MergePass(R,R1,n,len);
len=len*2;
//一趟归并,结果在R1中
MergePass(R1,R,n,len);
//再次归并,结果在R中
intrandom1(intnum){returnrand();
}//0~RAND_MAX=32767
intrandom3(intnum){//素数模乘同余法,0~M
intA=16807;
//16807,39722040,764261123,63036001648271?
intM=2147483647;
//有符号4字节最大素数,2^31-1
intQ=M/A;
intR=M%A;
staticintx=1,n=0,g=0;
//seed(setto1)
staticdoubler,r1=0,r2=0;
intx1;
x1=A*(x%Q)-R*(x/Q);
if(x1>
=0)x=x1;
elsex=x1+M;
r=1.*x/M;
if(r>
0.5)g++;
n++;
r1+=r;
r2+=r*r;
if(n%maxsize==0){
x="
r<
g<
n="
n<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 排序 综合 实验 报告