1、综合排序课程设计(论文)任务书 软件学院 学院 08 软件工程+ 电子商务 专业 一 班 一、课程设计(论文)题目各种排序算法演示 二、课程设计(论文)工作自2009 年 12 月 21 日起至 2009 年 12月 26 日止。三、课程设计(论文) 地点: 多媒体实验室(5-302,303) 四、课程设计(论文)内容要求:1本课程设计的目的(1)熟练掌握C语言的基本知识和技能; (2)掌握各种排序(插入、冒泡,快速排序,简单选择,堆排序)方法及适用场合,并能在解决实际问题时灵活应用;(3)从空间和时间的角度分析各种排序;(4)培养分析、解决问题的能力;提高学生的科技论文写作能力。 2课程设计
2、的任务及要求1)基本要求:(1)设计一个的菜单将在实现的功能显示出来,并有选择提示; (2)分别实现直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、简单选择排序,堆排序算法;(3)通过多种测试数据,对各种排序算法的时间复杂度和空间复杂度进行比较2)创新要求: 提高算法效率,降低时间复杂度和空间复杂度3)课程设计论文编写要求(1)要按照课程设计模板的规格书写课程设计论文(2)论文包括目录、正文、心得体会、参考文献等(3)课程设计论文用B5纸统一打印,装订按学校的统一要求完成4)答辩与评分标准: (1)完成原理分析:20分; (2)完成设计过程:40分; (3)完成调试:20分;(4)回
3、答问题:20分。5)参考文献:(1)严蔚敏,吴伟民.数据结构. 北京:清华大学出版社,2006. (2)严蔚敏、吴伟民、米宁.数据结构题集。北京:清华大学出版社,2006.(3) 谭浩强. C程序设计(第二版)作者:清华大学出版社,2006.6)课程设计进度安排内容 天数地点构思及收集资料 2图书馆编程设计与调试 5实验室撰写论文 3图书馆、实验室学生签名: 09 年12 月21 日课程设计(论文)评审意见(1)完成原理分析(20分):优()、良()、中()、一般()、差(); (2)设计分析(20分):优()、良()、中()、一般()、差(); (3)完成调试(20分):优()、良()、中(
4、)、一般()、差();(4)翻译能力(20分):优()、良()、中()、一般()、差();(5)回答问题(20分):优()、良()、中()、一般()、差();(6)格式规范性及考勤是否降等级:是()、否()评阅人: 职称: 讲师 09 年12 月28 日目录一、 问题描述 4二、 内容简介 42.1 基本要求: 42.2. 算法思想: 42.3. 模块划分: 42.4. 数据结构: 52.5. 源程序: 52.6. 测试情况: 15三、小结 17四、参考文献 18一、 问题描述1.如何定义数据类型,并编写书上没有的冒号排序。2.如何编写时间算法函数计算一个排序所用的时间。3.如何运用循环实现所
5、有排序算法时间和空间复杂度的比较。二、 内容简介2.1 基本要求:(1) 设计一个的菜单将在实现的功能显示出来,并有选择提示(2) 分别实现直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、简单排序、堆排序算法;(3) 通过多种测试数据,对各种排序算法的时间复杂度和空间复杂度进行比较2.2. 算法思想:1.自定义RECNODE结构体;2.依次定义各种排序的算法;3.设计一个高精度时间函数,分别测试各种排序的时间消耗;4.在主函数中,用开关语句swtich()case 值1;break;case值n;break;Default语句序列:n+1;调用各种排序算法,各种排序的时间消耗函数,从
6、而在屏幕上输出供选择的菜单,各种排序时间和空间复杂度的比较。2.3. 模块划分:1.输入初始数据函数:int MakeList(RECNODE *r) 2.输出未排序前的数据函数:void UndealoutList(RECNODE *r,int n) 3.处理后的序列函数:void DealoutList(RECNODE*r,int n) 4.这种排序的算法:void InsertSort(RECNODE*r,int n)/直接插入排序void BiInsertionSort (RECNODE*r, int n) / 折半插入排序void BubleSort(RECNODE *r,int n
7、) /冒泡排序int Partition(RECNODE*r,int*low,int*high)/一趟快速排序void QuickSort(RECNODE*r,int start,int end)/快速排序void SeleSort(RECNODE*r,int n)/直接选择排序void ShellSort(RECNODE *r,int n)/希尔排序void Sift(RECNODE*r,int i,int m)void HeapSort(RECNODE*r,int n)/堆排序5.排序时间测试函数:double TInsertSort(int len,RECNODE *a,int p)2.
8、4. 数据结构:1.预定义常量和自定义类型:#define MAXSIZE 100 typedef struct int key; RECNODE;2.基本函数的算法用以下形式表示:函数类型 函数名(函数参数表)/算法说明 语句序列/函数名。3.定义 int b,t,i,j; /b为记录交换的次数,t为记录排序的趟数,i为排序的数据,j为暂存数据的临时变量。4. 输入初始数据函数中定义int k, j,k为输入数据个数,j为输入的数据。5.快速排序中定义static int w=0,int *low,*high。6.在直接选择排序中定义int z,临时储存i的值。7.在希尔排序中定义int d
9、k,记录前后位置的增量。8.在排序时间消耗测试的函数和主函数中定义了int p,为菜单的序号。9.在主函数中定义int len,为测试数据的总长度。2.5. 源程序:#define MAXSIZE 100 / 一个用作示例的小顺序表的最大长度#include /* EOF(=Z或F6),NULL */#include#include#include /* malloc()等 */#include /* INT_MAX等 */#include /* atoi() */#include /* eof() */#include #include #include #include using nam
10、espace std;typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */typedef struct int key; RECNODE; int b,t; /b为记录交换的次数,t为记录排序的趟数int MakeList(RECNODE *r) int j,k; printf(请输入初始数据(每个数据以空格隔开,-1结束): ); k=0; scanf(%d,&j); while(j!=-1) k+; rk.key=j; scan
11、f(%d,&j); return k; /输入要排序的一组数据,并且返回数据的个数,以-1为结束标志void UndealoutList(RECNODE *r,int n) int i; printf(未排序前的数据 : ); for(i=0;in;i+) printf( %d,ri+1.key); printf(n); void DealoutList(RECNODE*r,int n) int i; printf(排序后的数据 : ); for(i=0;in;i+) printf( %d,ri+1.key); printf(n); printf(交换或比较的次数: %dn,b); print
12、f(排序的趟数: %dn,t); void InsertSort(RECNODE*r,int n)/直接插入排序/ int i,j; b=0,t=0; /b为记录交换的次数,t为记录排序的趟数 for(i=2;i=n;i+) r0=ri; /r0的作用是暂存空间 j=i-1; while(r0.keyrj.key) /如果目标数比源数小 rj+1=rj; /则让大的数从后往前依次往后挪一个位置,然后让小数插入到恰当位置 j-; b+; rj+1=r0;b+; t+; void BiInsertionSort (RECNODE*r, int n)/ 对记录序列R1.n作折半插入排序int low
13、,high,i,j,m;for ( i=2; i=n; +i ) r0 = ri; / 将Ri暂存到R0/low = 1; high = i-1;while (low=high) /在Rlow.high中折半查找插入的位置m = (low+high)/2; / 折半if (r0.key =high+1; -j )rj+1 = rj; / 记录后移rhigh+1 = r0; / 插入t+;b+ / BInsertSortvoid BubleSort(RECNODE *r,int n) /冒泡排序 int i,j; b=0,t=0; /b为记录交换的次数,t为记录排序的趟数 RECNODE tem
14、p; /暂寸空间 for(i=1;i=i;j-)/目标数是从第一个数开始,被比较数从最后一个开始 if(rj+1.keyrj.key) /如果目标数比其下一个数要大 /则两数交换,下一趟比较则还是用原目标数与其下一个书比较 temp=rj+1;rj+1=rj; rj=temp;b+; else b+; /否则不用交换,继续和下一个数比较 t+; void BubleSort(double a) /时间数组的冒泡排序 int i,j; b=0,t=0; double temp; for(i=1;i=i;j-) if(aj+1=temp.key)&(ij) j-; /则不用换,只要让指向要比较的数
15、的位置左移一位 w+; if(ij) /若遇到一个在目标数右边的小数 ri=rj; /则将小数赋给目标数原来所在的位置 i+; /要比较的数的位置右移一位 w+; while(ri.key=temp.key)&(ij)/同理比较,只是现在要比较的数在目标数的右边 i+; w+; if(ij) rj=ri; j-; w+; while(i!=j); ri=temp; b=w; /b为记录交换的次数 return i; void QuickSort(RECNODE*r,int start,int end)/快速排序 int i; static int q=0; if(startend) i= Pa
16、rtition(r,&start,&end); q+; QuickSort(r,start,i-1); /对低子表递归排序,i为中间位置 QuickSort(r,i+1,end); /对高子表递归排序 t=q;/t为记录排序的趟数 void SeleSort(RECNODE*r,int n)/直接选择排序/ /每次都是将无序序列中的最小的数找到,然后依次放到有序序列的最后 int i,j,z; b=0,t=0; /b为记录交换的次数,t为记录排序的趟数 RECNODE temp; for(i=1;in;i+) z=i; for(j=i+1;j=n;j+) /从第i个后的序列中选出最小的一个数
17、if(rj.key0) /一趟增量为dk的插入排序 for(i=dk+1;i=n;+i) if(ri.key0&r0.keyrj.key;j-=dk) rj+dk=rj; b+;/记录后移,查找插入位置 rj+dk=r0; dk=dk/2; /增量改为原来的一半 t+; void Sift(RECNODE*r,int i,int m) int j; static int x=0; RECNODE temp; temp=ri; j=2*i; while(j=m) /沿key较大的孩子结点向下筛选 if(jm&(rj.keyrj+1.key) /j为key较大的记录的下标 j+; x+; if(t
18、emp.key=1;-i) Sift(r,i,n); / 建大顶堆 for(i=n;i=2;-i) / 将堆顶记录和当前未经排序子序列 / H.r1.i中最后一个记录相互交换 temp=r1; r1=ri; ri=temp; Sift(r,1,i-1); / 对 H.r1 进行筛选 t+; double TInsertSort(int len,RECNODE *a,int p) if(p!=8) len=MakeList(a); UndealoutList(a,len); /若为时间效率全比较,则不用把比较的具体过程输出,只需输出排序时间 LARGE_INTEGER m_liPerfFreq=
19、0; QueryPerformanceFrequency(&m_liPerfFreq); LARGE_INTEGER m_liPerfStart=0; QueryPerformanceCounter(&m_liPerfStart); InsertSort(a,len); if(p!=8)DealoutList(a,len); LARGE_INTEGER liPerfNow=0; QueryPerformanceCounter(&liPerfNow); double time=liPerfNow.QuadPart - m_liPerfStart.QuadPart; time/=m_liPerfF
20、req.QuadPart; cout直接插入排序时间消耗:time MSn; return (time); /直接插入排序时间测试double TBiInsertionSort(int len,RECNODE *a,int p) if(p!=8) len=MakeList(a); UndealoutList(a,len); /若为时间效率全比较,则不用把比较的具体过程输出,只需输出排序时间 LARGE_INTEGER m_liPerfFreq=0; QueryPerformanceFrequency(&m_liPerfFreq); LARGE_INTEGER m_liPerfStart=0;
21、QueryPerformanceCounter(&m_liPerfStart); InsertSort(a,len); if(p!=8)DealoutList(a,len); LARGE_INTEGER liPerfNow=0; QueryPerformanceCounter(&liPerfNow); double time=liPerfNow.QuadPart - m_liPerfStart.QuadPart; time/=m_liPerfFreq.QuadPart; cout折半插入排序时间消耗:time MSn; return (time); /折半插入排序时间测试double TBub
22、leSort(int len,RECNODE *a,int p)if(p!=8)/若为时间效率全比较,则不用把比较的具体过程输出,只需输出排序时间len=MakeList(a); UndealoutList(a,len); LARGE_INTEGER m_liPerfFreq=0; QueryPerformanceFrequency(&m_liPerfFreq); LARGE_INTEGER m_liPerfStart=0; QueryPerformanceCounter(&m_liPerfStart); BubleSort(a,len); if(p!=8)DealoutList(a,len)
23、; LARGE_INTEGER liPerfNow=0; QueryPerformanceCounter(&liPerfNow); double time=liPerfNow.QuadPart - m_liPerfStart.QuadPart; time/=m_liPerfFreq.QuadPart; cout冒泡排序序时间消耗:time MSn; return (time); /冒泡排序时间测试double TQuickSort(int len,RECNODE *a,int p) if(p!=8)len=MakeList(a); UndealoutList(a,len); /若为时间效率全比
24、较,则不用把比较的具体过程输出,只需输出排序时间 LARGE_INTEGER m_liPerfFreq=0; QueryPerformanceFrequency(&m_liPerfFreq); LARGE_INTEGER m_liPerfStart=0; QueryPerformanceCounter(&m_liPerfStart); QuickSort(a,1,len); if(p!=8)DealoutList(a,len); /若为时间效率全比较,则不用把比较的具体过程输出,只需输出排序时间 LARGE_INTEGER liPerfNow=0; QueryPerformanceCounte
25、r(&liPerfNow); double time=liPerfNow.QuadPart - m_liPerfStart.QuadPart; time/=m_liPerfFreq.QuadPart; cout快速排序时间消耗:time MSn; return (time); /快速排序时间测试double TSeleSort(int len,RECNODE *a,int p) if(p!=8)len=MakeList(a); UndealoutList(a,len); LARGE_INTEGER m_liPerfFreq=0; QueryPerformanceFrequency(&m_liPerfFreq); LARGE_INTEGER m_liPerfStart=0; QueryPerformanceCounter(&m_liPerfStart);SeleSort(a,len); if(p!=8) DealoutList(a,len); /若为时间效率全比较,则不用把比较的具体过程输出,只需输出排序时间 LARGE_I