C语言课程设计---各种排序算法的设计和分析.doc_第1页
C语言课程设计---各种排序算法的设计和分析.doc_第2页
C语言课程设计---各种排序算法的设计和分析.doc_第3页
C语言课程设计---各种排序算法的设计和分析.doc_第4页
C语言课程设计---各种排序算法的设计和分析.doc_第5页
免费预览已结束,剩余7页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

华中科技大学文华学院数据结构 课 程 设 计 姓 名: 学 号: 学 部: 信息科学与技术学部 专 业: 班 级: 题 目: 各种排序算法的设计和分析 教 师: 2013年03月07日一. 课程设计报告的内容 1. 设计题目 2. 运行环境(软、硬件环境) 3. 算法设计的思想 4. 算法的流程图 5. 算法设计分析 6. 源代码 7. 运行结果分析 8. 收获及体会 二.数据结构课程设计题目各种排序算法的设计和分析1. 设计题目(1)、需求分析利用随机函数产生N个随机整数(N=4000),利用直接插入排序、折半插入排序,起泡排序、快速排序、选择排序、堆排序,基数排序七种排序方法(可添加其它排序方法)进行排序(结果为由小到大的顺序),并统计每一种排序所耗费的时间。把排序花的时间排在表格里面。(2)、程序的主要功能1.用户输入任意个数,产生相应的随机数2.用户可以自己选择排序方式(直接插入排序、折半插入排序、起泡排序、快速排序、选择排序、堆排序、基数排序)的一种3.程序给出原始数据、排序后从小到大的数据,并给出排序所用的时间。(3)、程序运行平台Visual C+ 6.0版本(4)、数据结构 (5)、算法及时间复杂度(一)各个排序是算法思想:(1)直接插入排序:将一个记录插入到已排好的有序表中,从而得到一个新的,记录数增加1的有序表。(2)折半插入排序:插入排序的基本插入是在一个有序表中进行查找和插入,这个查找可利用折半查找来实现,即为折半插入排序。(3)起泡排序:首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字。依此类推,直到第N-1和第N个记录的关键字进行过比较为止。上述为第一趟排序,其结果使得关键字的最大纪录被安排到最后一个记录的位置上。然后进行第二趟起泡排序,对前N-1个记录进行同样操作。一共要进行N-1趟起泡排序。(4)快速排序:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序。(5)选择排序:通过N-I次关键字间的比较,从N-I+1个记录中选出关键字最小的记录,并和第I(1=I=N)个记录交换。(6)堆排序:在堆排序的算法中先建一个大顶堆,既先选得一个关键字作为最大的记录并与序列中最后一个记录交换,然后对序列中前N-1记录进行选择,重新将它调整成一个大顶堆,如此反复直到排序结束。(7)基数排序:按最低位优先法先对低位关键字进行排序,直到对最高位关键字排序为止,经过若干次分配和收集来实现排序(二)时间复杂度分析排序算法 最差时间时间复杂度 是否稳定?插入排序 O(n2)O(n2) 稳定 冒泡排序O(n2)O(n2) 稳定 快速排序O(n2)O(n*log2n) 不稳定 选择排序O(n2)O(n2) 稳定 堆排序O(n*log2n) O(n*log2n) 不稳定 基数排序O(n*log2n)O(n2)稳定 4000个数据的时间比较:算法名称用时直接插入排序0.062折半插入排序0.047起泡排序0.188快速排序0.000选择排序0.078堆排序0.000基数排序0.000 (三)源代码:代码如下:#include#include#include#define N 4000void InsertSort() /第一个插入排序int i,j,t;int aN;for(i=0;iN;i+) ai=(int)rand(); printf(%d ,ai);printf(n);for(i=1;i=0&tat;j-) aj+1=aj; aj+1=t;for(i=0;iN;i+) printf(插入排序的程序:%dn,ai);void BInsertSort()/第二个,折半插入排序 int i=0,j=0,low=0,high=0,m=0; for(i=0;iN;i+) ai=(int)rand(); printf(%d ,ai);printf(n); for(i=2;i=N;+i) L0=Li; low=1;high=i-1; while(low=high) m=(low+high)/2; if(L0Lm) high=m-1; else low=m+1; for(j=i-1;L0Lj;-j) Lj+1=Lj; /记录后移 Lhigh+1=L0; /插入 void BubbleSort()/第三个,冒泡排序 int i,j,l; int aN; for(i=0;iN;i+) ai=(int)rand(); printf(%d ,ai); printf(n); for(i=0;iN;i+) for(j=0;jai+1) l=ai; ai=ai+1; ai+1=l; printf(输出的冒泡排序数:%d ,ai); int QuickSort()/第四个,快速排序int mid; int dataN;int low;int high; for(i=0;iN;i+) ai=(int)rand();printf(%d ,ai); printf(n); data0=datalow; mid=datalow; while(low high) while(low = mid) -high; datalow=datahigh; while(low high) & (datalow mid) +low; datahigh=datalow; datalow=data0; return low; void ChooseSort()/第五个,选择排序 int i,j,k,l; int aN; for(i=0;iN;i+) ai=(int)rand();printf(%d ,ai); printf(n); for(i=0;i10;i+) k=i; for(j=i+1;jaj) l=ai; ai=aj; aj=l; printf(%dn,ai); int HeapSort()/第六个,堆排序 int s; int i; int rN; r0=rs; for(i=0;iN;i+) ai=(int)rand(); printf(%d ,ai); for(i=2*s;i+1=N;i*=2) if(iN & ri=ri) break;rs=ri;s=i;rs=r0; return 1;typedef struct node int key; node *next; RecType; Status RadixSort(Sqlist L)/第七个,基数排序 int t,i,j,k,d,n=1; RecType *p,*s,*q,*head10,*tail10; for(i=1;ikey=L.ri; if(i=1) q=s; p=s; t+; else q-next=s; q=s; t+; q-next=NULL; d=1;while(n0) for(j=0;jkey/d; k=k%10; if(headk=NULL) headk=p; tailk=p; else tailk-next=p; tailk=p; p=p-next; p=NULL; for(j=0;jnext=headj; q=tailj; q-next=NULL; d=d*10; n=0;m=1;while(mkey; i+; p=p-next;return OK;/主函数void main() printf(请输入figure:);scanf(%d,&figure);clock_t start, finish; /定义clock_t用于计时double duration; printf(n *n);printf( n);printf( 算法排序比较系统 n);printf( n);printf( *n); printf( 以下是各个排序算法的代号:nn);printf( 一、直接插入排序 n);printf( 二、折半插入排序 n);printf( 三、冒泡排序 n);printf( 四、快速排序n);printf( 五、选择排序n);printf( 六、堆排序n);printf( 七、基数排序n); printf( 八、退出该系统nn);switch(figure)case 1:/直接插入排序start=clock(); InsertSort();finish = clock();break;case 2:/折半插入排序start = clock();BInsertSort(); finish = clock(); break;case 3:/冒泡排序start = clock();BubbleSort();finish = clock(); break;case 4:/快速排序start = clock();QuickSort(); finish = clock(); break;case 5:/选择排序start = clock();ChooseSort();finish = clock(); break;case 6:/堆排序start = clock();HeapSort();finish = clock(); break;case 7:/基数排序start = clock();RadixSort(l);finish = clock(); break;case 8:/直接退出break;duration = (double)(finish - start) / 1000; /输出算术时间printf(n本次的时间是:%lf secondsn,duration);感想体会与总结1、 做什么都需要耐心,做设计写程序更需要耐心。一开始的时候,我写函数写的很快,可是等最后调试的时候发现错误很隐蔽,就很费时间了。后来我先在纸上构思出函数的功能和参数,考虑好接口之后才动手编,这样就比较容易成功了。2、 做任何事情我决定都应该有个总体规划。之后的工作按照规划逐步展开完成。对于一个完整的程序设计,首先需要总体规划写程序的步骤,分块写分函数写,然后写完一部分马上纠错调试。而不是像我第一个程序,一口气写完,然后再花几倍的时间调试。一步步来,走好一步再走下

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论