实验3基本的排序技术.docx
- 文档编号:30755302
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:19
- 大小:192.27KB
实验3基本的排序技术.docx
《实验3基本的排序技术.docx》由会员分享,可在线阅读,更多相关《实验3基本的排序技术.docx(19页珍藏版)》请在冰豆网上搜索。
实验3基本的排序技术
实验报告
课程名称:
计算机软件技术基础
学 院:
物理电子学院
专 业:
电子信息与科学技术
学生姓名:
龙柱宇
学 号:
201040201030
日 期:
2015年6月21日
电子科技大学
实验报告
学生姓名:
龙柱宇学号:
2014040201030
一、实验室名称:
基础实验楼503
二、实验项目名称:
实验3-基本的排序技术
三、实验原理:
1、C语言,面向对象C++语言
2、编程的思路和方法
3、面向对象的编程思想
四、实验目的:
1.掌握C、C++的基本编程语法
2.学习Debug调试代码
3.熟悉在PC机上编程、连接、调试和运行C/C++程序的过程
5、实验内容:
冒泡排序、快速排序、简单插入排序、希尔排序、简单选择排序、堆排序、并归排序、基数排序的编程和应用
六、实验器材(设备、元器件):
设备:
Acer笔记本电脑;
系统:
win764位旗舰版;
软件:
MicrosoftVisualStudio2010;
七、实验数据及结果分析:
程序说明:
8个排序算法模块+1个主函数调用
程序流程图:
依次为冒泡排序、快速排序、简单插入排序、希尔排序、简单选择排序、堆排序、并归排序、基数排序
程序清单:
#include
#include
#include
#include
usingnamespacestd;
/*以°?
下?
为a冒¡ã泡Y排?
序¨°*/
template
voidbub(Tp[],intn)
{
intis=0,ie=n-1,i;
Tt;
while(is { for(i=is;i 比À¨¨较? { if(p[i]>p[i+1])//当Ì¡À发¤¡é现? 逆? 序¨°就¨ª交? 换? { t=p[i+1];p[i+1]=p[i];p[i]=t; } } ie--; for(i=ie;i>is;i--)//从䨮后¨®往ª¨´前¡ã扫¦¡§描¨¨ { if(p[i-1]>p[i]) { t=p[i-1];p[i-1]=p[i];p[i]=t;//逆? 序¨°交? 换? } } is++; } return; } /*以下为快速排序*/ template 类¤¨¤型¨ª voidqck(Tp[],intn) { if(n<=10) { bub(p,n); } else { TMidVal,Save,*NewSqe; intis,ie,im,nn; is=0; ie=n-1; im=(is+ie)/2; if((p[is]>p[ie]&&p[ie]>p[im])||(p[im]>p[ie]&&p[ie]>p[is]))MidVal=p[ie]; elseif((p[im]>p[is]&&p[is]>p[ie])||(p[ie]>p[is]&&p[is]>p[im]))MidVal=p[is]; elseMidVal=p[im]; Save=p[0]; while(is! =ie) { while(ie>is) { if(p[ie]<=MidVal) { p[is]=p[ie]; is++; break; } ie--; } while(is { if(p[is]>=MidVal) { p[ie]=p[is]; ie--; break; } is++; } } p[is]=Save; qck(p,is); NewSqe=p+(is+1); nn=n-(is+1); qck(NewSqe,nn); } } /*以下为简单插入排序*/ template 类¤¨¤型¨ª voidinsort(Tp[],intn) { Tt; intie,k; for(ie=1;ie 扫¦¡§描¨¨ { t=p[ie]; k=ie-1; while((k>=0)&&(p[k]>t))//当Ì¡À遇®? 到Ì? 逆? 序¨°时º¡À从䨮当Ì¡À前¡ã元a素? 开a始º? 依°¨¤次ä? 后¨®退ª? 一°? 位? { p[k+1]=p[k];k--; } p[k+1]=t; } return; } /*以下为希尔排序*/ template voidshel(Tp[],intn) { inti,j,d; Tt; d=n/2;//第̨²一°? 个? 增? 量¢? 序¨°列¢D减? 半ã? while(d>0) { for(j=d;j 比À¨¨较? 前¡ãk个? 数ºy { t=p[j]; i=j-d; while((i>=0)&&(p[i]>t)) { p[i+d]=p[i]; i=i-d; } p[i+d]=t; } d=d/2;//依°¨¤次ä? 减? 半ã? } return; } /*以下为简单选择排序*/ template voidselect(Tp[],intn) { Tmin; inti,j,pos; for(j=0;j<(n-1);j++) { min=p[j]; pos=j; for(i=j+1;i { if(p[i] { min=p[i]; pos=i; } if(pos! =j) { p[pos]=p[j];p[j]=min; } } } } /*以下为堆排序*/ template voidhap(Tp[],intn) { inti,mm; Tt; mm=n/2; for(i=mm-1;i>=0;i--) sift(p,i,n-1); for(i=n-1;i>=1;i--) {t=p[0];p[0]=p[i];p[i]=t;sift(p,0,i-1);} return; } template staticintsift(Tp[],inti,intn) { intj; Tt; t=p[i]; j=2*(i+1)-1; while(j<=n) { if((j if(t elsej=n+1; } p[i]=t; return0; } /*以下为归并排序*/ template voidMerge(TsourceArr[],TtempArr[],intstartIndex,intmidIndex,intendIndex) { inti=startIndex,j=midIndex+1,k=startIndex; while(i! =midIndex+1&&j! =endIndex+1) { if(sourceArr[i]>sourceArr[j]) tempArr[k++]=sourceArr[i++]; else tempArr[k++]=sourceArr[j++]; } while(i! =midIndex+1) tempArr[k++]=sourceArr[i++]; while(j! =endIndex+1) tempArr[k++]=sourceArr[j++]; for(i=startIndex;i<=endIndex;i++) sourceArr[i]=tempArr[i]; } //内¨²部? 使º1用®? 递ÌY归¨¦ template voidMergeSort(TsourceArr[],TtempArr[],intstartIndex,intendIndex) { intmidIndex; if(startIndex { midIndex=(startIndex+endIndex)/2; MergeSort(sourceArr,tempArr,startIndex,midIndex); MergeSort(sourceArr,tempArr,midIndex+1,endIndex); Merge(sourceArr,tempArr,startIndex,midIndex,endIndex); } } /*以°? 下? 为a基¨´数ºy排? 序¨°*/ intgetdigit(intx,intd) { inta[]={1,1,10};//因°¨°为aa待äy排? 数ºy据Y最Á? 大䨮数ºy据Y也°22只? 是º? 两¢? ¢¨¦位? 数ºy,ê? 所¨´´? 以°? 在¨²此ä? 只? 需¨¨要°aa到Ì? 十º? 位? 就¨ª满¨²足Á? return((x/a[d])%10);//确¨¡¤定¡§桶ª¡ã号? } template voidmsdradix_sort(Tarr[],intbegin,intend,intd) { constintradix=10; intcount[radix],i,j; //初? 始º? 化¡¥ for(i=0;i { count[i]=0; } int*bucket=(int*)malloc((end-begin+1)*sizeof(int));//分¤? 配? 桶ª¡ã存ä? 储ä¡é空? 间? for(i=begin;i<=end;++i)//统ª33计? 各¡Â桶ª¡ã需¨¨要°aa装Á¡ã的Ì? 元aa素? 的Ì? 个? 数ºy { count[getdigit(arr[i],d)]++; } for(i=1;i 桶ª¡ã的Ì? 边À? 界? 索¡Â引°y,ê? count[i]值¦Ì为aa第̨²i个? 桶ª¡ã的Ì? 右®¨°边À? 界? 索¡Â引°y+1 { count[i]=count[i]+count[i-1]; } for(i=end;i>=begin;--i)//这aa里¤? 要°aa从䨮右®¨°向¨°左Á¨®扫¦¡§描¨¨,ê? 保À¡ê证¡è排? 序¨°稳¨¨定¡§性? { j=getdigit(arr[i],d);//求¨®出? 关? 键¨¹¹码? 的Ì? 第̨²d位? 的Ì? 数ºy字Á? ,ê? 例¤y如¨? : êoo576的Ì? 第̨²3位? 是º? 5 bucket[count[j]-1]=arr[i];//放¤? 入¨? 对? 应®||的Ì? 桶ª¡ã中DD,ê? count[j]-1是º? 第̨²j个? 桶ª¡ã的Ì? 右®¨°边À? 界? 索¡Â引°y --count[j];//第̨²j个? 桶ª¡ã放¤? 下? 一°? 个? 元aa素? 的Ì? 位? 置? (右®¨°边À? 界? 索¡Â引°y+1) } for(i=begin,j=0;i<=end;++i,++j)//从䨮各¡Â个? 桶ª¡ã中DD收º? 集¡¥数ºy据Y { arr[i]=bucket[j]; } free(bucket);//释º¨ª放¤? 存ä? 储ä¡é空? 间? for(i=0;i 各¡Â桶ª¡ã中DD数ºy据Y进? 行DD再¨´´? 排? 序¨° { intp1=begin+count[i];//第̨²i个? 桶ª¡ã的Ì? 左Á¨®边À? 界? intp2=begin+count[i+1]-1;//第̨²i个? 桶ª¡ã的Ì? 右®¨°边À? 界? if(p1 { msdradix_sort(arr,p1,p2,d-1);//对? 第̨²i个? 桶ª¡ã递ÌY归¨¦调Ì¡Â用®? ,ê? 进? 行DD基¨´´? 数ºy排? 序¨°,ê? 数ºy位? 降¦Ì1 } } } voidmain() { intn,m; double*p; cout<<"有®D多¨¤少¦¨´个? 元a素? : êo"; cin>>n;//待äy排? 序¨°数ºy组Á¨¦长¡è度¨¨ p=newdouble[n]; for(inti=0;i 个? 随? 机¨²数ºy组Á¨¦ { time(0); m=rand(); p[i]=m; } cout<<"原-始º? 序¨°列¢D"< for(inti=0;i {cout< cout<<"冒¡ã泡Y排? 序¨°"< bub(p,n); for(inti=0;i {cout< cout< cout<<"快¨¬速¨´排? 序¨°"< qck(p,n); for(inti=0;i {cout< cout< cout<<"简¨°单Ì£¤插? 入¨? 排? 序¨°"< insort(p,n); for(inti=0;i {cout< cout< cout<<"希¡ê尔? 排? 序¨°"< shel(p,n); for(inti=0;i {cout< cout< cout<<"简¨°单Ì£¤选? 择? "< select(p,n); for(inti=0;i {cout< cout< cout<<"堆? 排? 序¨°"< hap(p,n); for(inti=0;i {cout< cout< cout<<"并¡é归¨¦排? 序¨°"< double*b; b=newdouble[n]; MergeSort(p,b,0,n-1); for(inti=n-1;i>=0;i--) {cout< cout<<"基¨´数ºy排? 序¨°"< intlen=sizeof(p)/sizeof(int); msdradix_sort(p,0,len-1,1); for(inti=n-1;i>=0;i--) {cout< cout< return; } 调试说明: 导致上图的主要原因: 在于漏掉了下图“ie--”和“is++”两句,而产生死循环 运行结果: 9、实验结论: 排序算法有着许多种类和改进版本,对于合适的数据对象根据算法的复杂度而采用合适的数据结构和排序算法是很重要的,这关系到处理的速率和效率,同时对排序算法的优化也是一直在进行的课题。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 基本 排序 技术