ImageVerifierCode 换一换
格式:DOCX , 页数:38 ,大小:242.76KB ,
资源ID:10163867      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10163867.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(内部排序算法的实现与比较.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

内部排序算法的实现与比较.docx

1、内部排序算法的实现与比较实验四:内部排序算法的实现与比较一、 问题描述 1 实验题目:在教科书中,各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大致执行时间。试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。2 基本要求:(1)对常用的内部排序算法进行比较:直接插入排序、简单选择排序、冒泡排序、快速排序、希尔排序、归并排序。(2利用随机函数产生N(N=30000)个随机整数,作为输入数据作比较;比较的指标为关键字参加的比较次数和关键字的移动次数(关键字交换记为3次移动)。(3)对结果作出简要分析。3 测试数据:随机函数产生。二、 需求分析 1 程序所能

2、达到的基本可能:通过随机数据产生N个随机数,作为输入数据作比较;对常用的内部排序算法:直接插入排序、简单选择排序、冒泡排序、快速排序、希尔排序、归并排序进行比较:比较的指标为关键字参加的比较次数和关键字的移动次数(关键字交换记为3次移动)。最后结果输出各种排序算法的关键字参加的比较次数和关键字的移动次数,并按从小到大排列。2 输入的形式及输入值范围 :随机函数产生的N(N=30000)个随机整数。3 输出的形式:输出各种排序算法的关键字参加的比较次数和关键字的移动次数。并按从小到大排列。4 测试数据要求:随机函数产生的N(N=30000)个随机整数。三、 概要设计 1. 所用到得数据结构及其A

3、DT 为了实现上述功能,应以一维数组表示集合数据类型。 int sN; int compare6=0,move6=0,DN=0,RSN=0;基本操作: 数组赋值:for(i=1;iN;i+) si=rand()%100; printf(%dt,si); void copys(int S,int RS,int n)/将s的值赋给RS,void SelectSort(int RS,int n) /直接选择排序void BubbleSort(int RS,int n)/冒泡排序void InsertSort(int RS,int n) /直接插入排序int QuickSort(int RS,int

4、low,int high)/快速排序void QuickSortprint(int RS,int n)/输出快速排序后的结果void Shellsert(int RS,int m,int n)/一趟希尔排序,按间隔m划分子序列void Shellsort(int RS,int n)/希尔排序void Merge(int RS,int low,int mid,int high)/将两个有序序列归并为一个有序序列void MSort(int RS,int low,int high)/归并排序2. 主程序流程及其模块调用关系 void SelectSort(int RS,int n) /直接选择排序

5、模块void BubbleSort(int RS,int n)/冒泡排序模块void InsertSort(int RS,int n) /直接插入排序模块int QuickSort(int RS,int low,int high)/快速排序模块void Shellsert(int RS,int m,int n)/一趟希尔排序,按间隔m划分子序列void Shellsort(int RS,int n)/希尔排序模块void Merge(int RS,int low,int mid,int high)/将两个有序序列归并为一个有序序列模块调用四、 详细设计 1. 实现每个操作的伪码,重点语句加注释

6、 1)void copys(int S,int RS,int n)/数组复制 int i; for(i=1;in;i+) RSi=Si;2)直接选择排序void SelectSort(int RS,int n) /直接选择排序 int i,j,k; for(i=1;in;i+) k=i; for(j=i+1;j=n;j+) if(RSjRSk) k=j; compare0+; if(k!=i) RS0=RSk; RSk=RSi; RSi=RS0; move0+=3; printf(直接选择排序后的结果:); for(i=1;i=n;i+) printf(%dt,RSi); printf(n);

7、 printf(关键字参加的比较次数:%d,关键字的移动次数:%dn,compare0,move0); printf(n);3)冒泡排序void BubbleSort(int RS,int n)/冒泡排序 int i,j,flag; for(i=1;i=n;i+) flag=True; for(j=1;j=n-i;j+) if(RSj+1RSj) flag=False; RS0=RSj; RSj=RSj+1; RSj+1=RS0; move1+=3; compare1+; if(flag=True) break; printf(冒泡排序后的结果:); for(i=1;i=n;i+) print

8、f(%dt,RSi); printf(n); printf(关键字参加的比较次数:%d,关键字的移动次数:%dn,compare1,move1); printf(n);4)直接插入排序void InsertSort(int RS,int n) /直接插入排序 int i,j; for(i=2;i=n;i+) RS0=RSi; j=i-1; move2+; while(RS0RSj) compare2+; RSj+1=RSj; move2+; j-; compare2+; RSj+1=RS0; move2+; printf(直接插入排序后的结果:); for(i=1;i=n;i+) printf

9、(%dt,RSi); printf(n); printf(关键字参加的比较次数:%d,关键字的移动次数:%dn,compare2,move2); printf(n);5)快速排序int QuickSort(int RS,int low,int high)/快速排序 int i,j,n; n=high; i=low; j=high; RS0=RSi; move3+; while(i=RS0&ji) j-; compare3+; compare3+; if(ji) RSi=RSj; move3+; i+; while(RSii) i+; compare3+; compare3+; if(ji) R

10、Sj=RSi; move3+; j-; RSi=RS0; move3+; if(lowi) QuickSort(RS,low,i-1); if(ihigh) QuickSort(RS,j+1,high);6)输出快速排序后的结果void QuickSortprint(int RS,int n)/输出快速排序后的结果 int i; QuickSort(RS,1,n); printf(快速排序后的结果:); for(i=1;i=n;i+) printf(%dt,RSi); printf(n); printf(关键字参加的比较次数:%d,关键字的移动次数:%dn,compare3,move3); p

11、rintf(n);7)一趟希尔排序,按间隔m划分子序列void Shellsert(int RS,int m,int n)/一趟希尔排序,按间隔m划分子序列 int i,j,temp; for(i=m;i=m&temp=1)/循环直到m为0 Shellsert(RS,m,n); m=(m=2?1:(m/2);/缩小增进量 printf(希尔排序后的结果:); for(i=1;i=n;i+) printf(%dt,RSi); printf(n); printf(关键字参加的比较次数:%d,关键字的移动次数:%dn,compare4,move4); printf(n);9)将两个有序序列归并为一个

12、有序序列void Merge(int RS,int low,int mid,int high)/将两个有序序列归并为一个有序序列 int i,j,k; int n1,n2; i=low; j=mid+1; k=low; while(i=mid&j=high)/两两比较 if(RSi=RSj) Dk=RSi; i+; k+; else Dk=RSj; j+; k+; compare5+; move5+; if(i=mid) for(n1=k,n2=i;n1=high&n2=mid;n1+,n2+) Dn1=RSn2; move5+; else for(n1=k,n2=j;n1=high&n2=h

13、igh;n1+,n2+) Dn1=RSn2; move5+; for(mid=low;mid=high;mid+) RSmid=Dmid; move5+; 10)归并排序void MSort(int RS,int low,int high)/归并排序 int mid; if(lowhigh) mid=(low+high)/2; MSort(RS,low, mid); MSort(RS, mid+1,high); Merge(RS,low,mid,high); 11)主函数void main() int i,j,sN; time_t rawtime; struct tm * timeinfo;

14、time (&rawtime); timeinfo = localtime (&rawtime); printf( 实验名称:实验四:内部排序算法的实现与比较n); printf( 姓名:王亚文n); printf(=n); printf(程序运行开始,); printf(Current local time and date:%s,asctime(timeinfo); printf(产生的随机数为:n); for(i=1;iN;i+) si=rand()%100; printf(%dt,si); printf(n); do copys(s,RS,N); printf(请选择所需排序方法:);

15、 printf(n); printf(1.选择法 ,2.冒泡法 ,3.插入法 ,4.快速法 , 5.希尔排序法 ,6.归并排序法,7.输出比较信息,8.退出n); scanf( %d,&j); switch(j) case 1: SelectSort(RS,N-1); break; case 2: BubbleSort(RS,N-1); break; case 3: InsertSort(RS,N-1); break; case 4: QuickSortprint(RS,N-1); break; case 5: Shellsort(RS,N-1); break; case 6: MSort(R

16、S,1,N-1); printf(归并排序后的结果:); for(i=1;iN;i+) printf(%dt,Di); printf(n); printf(关键字参加的比较次数:%d,关键字的移动次数:%dn,compare5,move5); printf(n); break; case 7: SelectSort(compare,5); SelectSort(move,5); printf(关键字参加的比较次数:n); for(i=1;i=5;i+) printf(%dt,comparei); printf(n); printf(关键字的移动次数:n); for(i=1;i=5;i+) pr

17、intf(%dt,movei); printf(n); break; case 8: printf(Current local time and date:%s,asctime(timeinfo); exit(0); break; while(1); 五、 调试分析 1. 设计与调试过程中遇到的问题分析、体会 调试过程:由于本次程序设计的数据和模块比较多,所以采用分块调试的方法,在编写完一个内部排序算法后,为了验证是否排序成功以及所输出的关键字比较次数和移动次数是否正确,采用先定义一个需要排序9个数字的数组,S10=0,1,2,3,4,5,6,7,8,9和S10=0,9,8,7,6,5,4,3

18、,2,1,用这两个数组检验程序的正确性与否。调试步骤,程序及相关结果如下:1)直接选择排序:#include #include #include void SelectSort(int RS,int n) /直接选择排序 int i,j,k,move=0,compare=0; for(i=1;in;i+) k=i; for(j=i+1;j=n;j+) if(RSjRSk) k=j; compare+; if(k!=i) RS0=RSk; RSk=RSi; RSi=RS0; move+=3; printf(直接选择排序后的结果:); for(i=1;i=n;i+) printf(%dt,RSi)

19、; printf(n); printf(关键字参加的比较次数:%d,关键字的移动次数:%dn,compare,move); printf(n);void main() int s10=0,1,2,3,4,5,6,7,8,9; SelectSort(s,9);s10=0,1,2,3,4,5,6,7,8,9;S10=0,9,8,7,6,5,4,3,2,12)冒泡排序#include #include #include #define False 0#define True 1void BubbleSort(int RS,int n)/冒泡排序 int i,j,flag,move=0,compare

20、=0; for(i=1;i=n;i+) flag=True; for(j=1;j=n-i;j+) if(RSj+1RSj) flag=False; RS0=RSj; RSj=RSj+1; RSj+1=RS0; move+=3; compare+; if(flag=True) break; printf(冒泡排序后的结果:); for(i=1;i=n;i+) printf(%dt,RSi); printf(n); printf(关键字参加的比较次数:%d,关键字的移动次数:%dn,compare,move); printf(n);void main() int s10=0,1,2,3,4,5,6

21、,7,8,9; BubbleSort(s,9);s10=0,1,2,3,4,5,6,7,8,9s10=0,9,8,7,6,5,4,3,2,1;3)直接插入排序#include #include #include #define False 0#define True 1void InsertSort(int RS,int n) /直接插入排序 int i,j,compare=0,move=0; for(i=2;i=n;i+) RS0=RSi; j=i-1; move+; while(RS0RSj) compare+; RSj+1=RSj; move+; j-; compare+; RSj+1=

22、RS0; move+; printf(直接插入排序后的结果:); for(i=1;i=n;i+) printf(%dt,RSi); printf(n); printf(关键字参加的比较次数:%d,关键字的移动次数:%dn,compare,move); printf(n);void main() int s10=0,9,8,7,6,5,4,3,2,1; InsertSort(s,9); s10=0,9,8,7,6,5,4,3,2,1;s10=0,1,2,3,4,5,6,7,8,9;4)快速排序#include #include #include #define False 0#define Tr

23、ue 1int compare6=0,move6=0;int QuickSort(int RS,int low,int high)/快速排序 int i,j,n; n=high; i=low; j=high; RS0=RSi; move3+; while(i=RS0&ji) j-; compare3+; compare3+; if(ji) RSi=RSj; move3+; i+; while(RSii) i+; compare3+; compare3+; if(ji) RSj=RSi; move3+; j-; RSi=RS0; move3+; if(lowi) QuickSort(RS,low,i-1); if(ihigh) QuickSort(RS,j+1,high);void QuickSortprint(int RS,int n)/输出快速排序后的结果 int i; QuickSort(RS,1,n); printf(快速排序后的结果:); for(i=1;i=n;i+) printf(%dt,RSi)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1