收藏 分享(赏)

实验九 内部排序.doc

上传人:精品资料 文档编号:10697922 上传时间:2019-12-29 格式:DOC 页数:12 大小:196KB
下载 相关 举报
实验九 内部排序.doc_第1页
第1页 / 共12页
实验九 内部排序.doc_第2页
第2页 / 共12页
实验九 内部排序.doc_第3页
第3页 / 共12页
实验九 内部排序.doc_第4页
第4页 / 共12页
实验九 内部排序.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

1、实验九 内部排序1、实验目的1、深入了解各种排序方法的基本思想、排序过程。2、熟练掌握各种排序方法的实现和特点,掌握各种排序方法的时间复杂度的分析方法。3、掌握各种排序方法所适应的不同场合,能加以灵活运用。2、实验内容和要求2、典型内部排序算法的比较。(1)针对“12.11.4 参考源程序”,随机产生整数样本,进行 8 种排序,并比较各种排序算法的执行时间,如执行时间均为 0,可考虑增大样本,如加大至 5000。(2)修改“12.11.4 参考源程序”,输出 8 种排序算法的每一趟结果。3、实验过程及结果(1)源代码:#include “stdio.h“#include “conio.h“#i

2、nclude “stdlib.h“#include “time.h“#define OK 1#define ERROR 0#define OVERFLOW -1#define MAXSIZE 5000 /设待排序记录数不超过 5000 个typedef int Status;typedef int KeyType; /定义关键字为整型typedef int InfoType; /定义其它数据项类型为整型typedef struct KeyType key; /关键字项InfoType otherinfo; /其他数据项RedType;typedef struct /定义顺序表的结构RedTyp

3、e *r; /存储空间基址,人 r0闲置或用作哨兵或用作缓冲区int length; /顺序表长度SqList;Status InitSqList(SqList *L); /构造一个空的顺序表 LStatus CreateSqList(SqList *L); /输入数据元素个数,随机产生整数样本Status CopySqList(SqList L_BAK,SqList *L); /Status OutputSqList(SqList L); /输出排序之后的数据int LT(KeyType e1,KeyType e2); /判断数据元素 e1 是否小余 e2void Swap(RedType

4、*e1,RedType *e2); /数据元素 e1 和 e2 互换Status InsertSort(SqList *L); /直接排入排序Status BInsertSort(SqList *L); /折半插入排序Status ShellInsert(SqList *L,int dk); /一趟希尔排序Status ShellSort(SqList *L,int dlta,int t); /希尔排序Status BubbleSort(SqList *L); /冒泡排序int Partition(SqList *L,int low,int high); /一趟快速排序void QSort(S

5、qList *L,int low,int high); /对 L 中子序列 L.rlowhigh进行快速排序Status QuickSort(SqList *L); /对 L 进行快速排序Status SelectSort(SqList *L); /直接选择排序Status HeapAdjust(SqList *H,int S,int m); /调整 L.rs的关键字,使L.rsm成大顶堆Status HeapSort(SqList *L); /堆排序Status Merge(SqList *L,int low,int mid,int high); /将两个有序的子序列L.rlowmid和 L

6、.rmidhigh归并成有序的序列 L.rlowhighvoid MSort(SqList *L,int len); /对 L.r1n做一趟归并排序Status MergeSort(SqList *L); /对 L.r1n自底向上二路归并排序void main() /典型内部排序的比较SqList L,L_BAK;int select,flag=1,t,dltaMAXSIZE;double duration;clock_t start,finish; /clock_t 用于计时InitSqList(InitSqList(CreateSqList(t=0; /产生希尔排序的增量序列 dlta0t

7、dlta0=L_BAK.length/2;while(dltat1)dltat+1=dltat/2;t+;while(flag)CopySqList(L_BAK,printf(“Please select:n“);printf(“1.InsertSort n“);printf(“2.BInsertSort n“);printf(“3.ShellSort n“);printf(“4.BubbleSort n“);printf(“5.QuickSort n“);printf(“6.SelectSort n“);printf(“7.HeapSort n“);printf(“8.MergeSort n

8、“);printf(“9.Exit n“);scanf(“%d“,switch(select)case 1:printf(“nNow is in InsertSort“);start=clock();InsertSort(finish=clock();break;case 2:printf(“nNow is in BInsertSort“);start=clock();BInsertSort(finish=clock();break;case 3:printf(“nNow is in ShellSort“);start=clock();ShellSort(finish=clock();brea

9、k;case 4:printf(“nNow is in BUbbleSort“);start=clock();BubbleSort(finish=clock();break;case 5:printf(“nNow is in QuickSort“);start=clock();QuickSort(finish=clock();break;case 6:printf(“nNow is in SelectSort“);start=clock();SelectSort(finish=clock();break;case 7:printf(“nNow is in HeapSort“);start=cl

10、ock();HeapSort(finish=clock();break;case 8:printf(“nNow is in MergeSort“);start=clock();MergeSort(finish=clock();break;default:flag=0;printf(“Press any key to exit!n“);getch();printf(“n“);OutputSqList(L);duration=(double)(finish-start)/CLK_TCK; /输出算数时间printf(“nThe Sort Spend: %lf secondsn“,duration)

11、;Status InitSqList(SqList *L)L-r=(RedType *)malloc(MAXSIZE+1)*sizeof(RedType); /分配内存if(!L-r)exit(OVERFLOW);L-length=0;return OK;Status CreateSqList(SqList *L)int i;srand(time(NULL);printf(“nPlease Input the Number of UnSorted Data: “);scanf(“%d“,for(i=1;ilength;i+)L-ri.key=rand(); /随机产生整数样本printf(“n

12、nThe UnSorted data is:n“);for(i=1;ilength;i+)printf(“%8d“,L-ri.key);printf(“n“);return OK;Status CopySqList(SqList L_BAK,SqList *L)int i;if(!L_BAK.length)printf(“The SqList is Empty!“);return ERROR;for(i=1;iri.key=L_BAK.ri.key;L-length=L_BAK.length;return OK;Status OutputSqList(SqList L)int i;printf

13、(“nThe Length of SqList is:%dn“,L.length);printf(“nnThe Sorted Data is:n“);for(i=1;ilength)printf(“The SqList is Empty!“);return ERROR;for(i=2;ilength;i+)if(LT(L-ri.key,L-ri-1.key)L-r0=L-ri;L-ri=L-ri-1;for(j=i-2;LT(L-r0.key,L-rj.key);j-)L-rj+1=L-rj;L-rj+1=L-r0;return OK;Status BInsertSort(SqList *L)

14、int i,j,mid,low,high;if(!L-length)printf(“The SqList is Empty!“);return ERROR;for(i=2;ilength;i+)L-r0=L-ri;low=1;high=i-1;while(lowr0.key,L-rmid.key)high=mid-1;elselow=mid+1;for(j=i-1;j=high+1;j-)L-rj+1=L-rj;L-rhigh+1=L-r0;return OK;Status ShellInsert(SqList *L,int dk)int i,j;for(i=dk+1;ilength;i+)i

15、f(LT(L-ri.key,L-ri-dk.key)L-r0=L-ri;for(j=i-dk;j0j-=dk)L-rj+dk=L-rj;L-rj+dk=L-r0;return OK;Status ShellSort(SqList *L,int dlta,int t)int k;if(!L-length)printf(“The SqList is Empty!“);return ERROR;for(k=0;klength)printf(“The SqList is Empty!“);return ERROR;for(i=1;ilength;i+)for(j=1;jlength-i;j+)if(!

16、LT(L-rj.key,L-rj+1.key)Swap(return OK;int Partition(SqList *L,int low,int high)int pivotkey;L-r0=L-rlow;pivotkey=L-rlow.key;while(lowrhigh.key=pivotkey)high-;L-rlow=L-rhigh;while(lowrhigh.keyrhigh=L-rlow;L-rlow=L-r0;return low;void QSort(SqList *L,int low,int high)int pivotkey;if(lowlength)printf(“T

17、he SqList is Empty!“);return ERROR;QSort(L,1,L-length);return OK;Status SelectSort(SqList *L)int i,j,min;if(!L-length)printf(“The SqList is Empty!“);return ERROR;for(i=1;ilength;i+)min=i;for(j=i+1;jlength-i;j+)if(LT(L-rj.key,L-rmin.key)min=j;if(min!=i)Swap(return OK;Status HeapAdjust(SqList *H,int s

18、,int m)int j;H-r0=H-rs;for(j=2*s;jrj.key,H-rj+1.key)j+;if(!LT(H-r0.key,H-rj.key)break;H-rs=H-rj;s=j;H-rs=H-r0;return OK;Status HeapSort(SqList *H)int i;if(!H-length)printf(“The SqList is Empty!“);return ERROR;for(i=H-length/2;i0;i-)HeapAdjust(H,i,H-length);for(i=H-length;i1;i-)Swap(HeapAdjust(H,1,i-

19、1);return OK;Status Merge(SqList *L,int low,int mid,int high)int i=low,j=mid+1,k=0; /赋初值SqList L1; /L1 暂存 L.rlowmid和 L.rmid+1high归并后的结果L1.r=(RedType *)malloc(high-low+1)*sizeof(RedType); /分配内存if(!L1.r)exit(OVERFLOW);while(iri.key,L-rj.key)?L-ri+:L-rj+;while(iri+;while(jrj+;for(k=0,i=low;iri.key=L1.r

20、k.key; /将归并结果复制回 L-rlowhighreturn OK;void MSort(SqList *L,int len)int i;for(i=1;i+2*len-1length;i=i+2*len) /归并长度为 len 的两个相邻的子序列Merge(L,i,i+len-1,i+2*len-1);if(i+len-1length) /仍有一个子序列,其中后一个长度小于 len;此时,若 ilength 且 i+len-1=L-length 时,则剩余一个子序列轮空,无须归并Merge(L,i,i+len-1,L-length); /归并最后两个子序列Status MergeSor

21、t(SqList *L)int len;if(!L-length)printf(“The SqList is Empty!“);return ERROR;for(len=1;lenlength;len*=2) /有效长度 len=n 时终止MSort(L,len);return OK;结果:1、样本数量为 100 时:依次进行 8 种排序的执行时间:2、样本数量为 1000 时:8 种排序执行时间依次为:结果分析:经多次排序发现,8 种排序方法存在一定的执行速度差异,但是并不明显,而且其时间复杂度与随机序列情况有关,不同的序列即使样本数相同采用相同的排序方法执行时间也有不同,而同一序列采用不同

22、的排序方法执行时间也可能不同,针对某一特定序列,只有采用其最适合的一种排序方法才会效率最高,而当样本数量较小时由上述实验可知执行时间均为 0。(2)一趟排序(一趟希尔插入排序、一趟快速排序、一趟归并排序)目录部分:printf(“Please select:n“);printf(“1.ShellInsert n“);printf(“2.Partition n“);printf(“3.MSort n“);printf(“9.Exit n“);选项操作 :case 1:printf(“nNow is in ShellInsert“);start=clock();ShellInsert(finish=clock();break;case 2:printf(“nNow is in Partition“);start=clock();Partition(finish=clock();break;case 3:printf(“nNow is in MSort“);start=clock();MSort(finish=clock();break;default:flag=0;printf(“Press any key to exit!n“);getch();执行结果:(1)样本数量为 20、一趟希尔排序结果:(2)一趟快速排序:(3)一趟归并排序:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报