实验九 内部排序.docx
- 文档编号:4497092
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:16
- 大小:98.93KB
实验九 内部排序.docx
《实验九 内部排序.docx》由会员分享,可在线阅读,更多相关《实验九 内部排序.docx(16页珍藏版)》请在冰豆网上搜索。
实验九内部排序
实验九内部排序
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"
#include"stdlib.h"
#include"time.h"
#defineOK1
#defineERROR0
#defineOVERFLOW-1
#defineMAXSIZE5000//设待排序记录数不超过5000个
typedefintStatus;
typedefintKeyType;//定义关键字为整型
typedefintInfoType;//定义其它数据项类型为整型
typedefstruct{
KeyTypekey;//关键字项
InfoTypeotherinfo;//其他数据项
}RedType;
typedefstruct{//定义顺序表的结构
RedType*r;//存储空间基址,人r[0]闲置或用作哨兵或用作缓冲区
intlength;//顺序表长度
}SqList;
StatusInitSqList(SqList*L);//构造一个空的顺序表L
StatusCreateSqList(SqList*L);//输入数据元素个数,随机产生整数样本
StatusCopySqList(SqListL_BAK,SqList*L);//
StatusOutputSqList(SqListL);//输出排序之后的数据
intLT(KeyTypee1,KeyTypee2);//判断数据元素e1是否小余e2
voidSwap(RedType*e1,RedType*e2);//数据元素e1和e2互换
StatusInsertSort(SqList*L);//直接排入排序
StatusBInsertSort(SqList*L);//折半插入排序
StatusShellInsert(SqList*L,intdk);//一趟希尔排序
StatusShellSort(SqList*L,intdlta[],intt);//希尔排序
StatusBubbleSort(SqList*L);//冒泡排序
intPartition(SqList*L,intlow,inthigh);//一趟快速排序
voidQSort(SqList*L,intlow,inthigh);//对L中子序列L.r[low..high]进行快速排序
StatusQuickSort(SqList*L);//对L进行快速排序
StatusSelectSort(SqList*L);//直接选择排序
StatusHeapAdjust(SqList*H,intS,intm);//调整L.r[s]的关键字,使L.r[s..m]成大顶堆
StatusHeapSort(SqList*L);//堆排序
StatusMerge(SqList*L,intlow,intmid,inthigh);//将两个有序的子序列L.r[low..mid]和L.r[mid..high]归并成有序的序列L.r[low..high]
voidMSort(SqList*L,intlen);//对L.r[1..n]做一趟归并排序
StatusMergeSort(SqList*L);//对L.r[1..n]自底向上二路归并排序
voidmain(){//典型内部排序的比较
SqListL,L_BAK;
intselect,flag=1,t,dlta[MAXSIZE];
doubleduration;
clock_tstart,finish;//clock_t用于计时
InitSqList(&L);
InitSqList(&L_BAK);
CreateSqList(&L_BAK);
t=0;//产生希尔排序的增量序列dlta[0..t]
dlta[0]=L_BAK.length/2;
while(dlta[t]>1){
dlta[t+1]=dlta[t]/2;
t++;
}
while(flag){
CopySqList(L_BAK,&L);
printf("Pleaseselect:
\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");
printf("9.Exit\n");
scanf("%d",&select);
switch(select){
case1:
printf("\nNowisinInsertSort......");
start=clock();
InsertSort(&L);
finish=clock();
break;
case2:
printf("\nNowisinBInsertSort......");
start=clock();
BInsertSort(&L);
finish=clock();
break;
case3:
printf("\nNowisinShellSort......");
start=clock();
ShellSort(&L,dlta,t+1);
finish=clock();
break;
case4:
printf("\nNowisinBUbbleSort......");
start=clock();
BubbleSort(&L);
finish=clock();
break;
case5:
printf("\nNowisinQuickSort......");
start=clock();
QuickSort(&L);
finish=clock();
break;
case6:
printf("\nNowisinSelectSort......");
start=clock();
SelectSort(&L);
finish=clock();
break;
case7:
printf("\nNowisinHeapSort......");
start=clock();
HeapSort(&L);
finish=clock();
break;
case8:
printf("\nNowisinMergeSort......");
start=clock();
MergeSort(&L);
finish=clock();
break;
default:
flag=0;
printf("Pressanykeytoexit!
\n");
getch();
}
printf("\n");
OutputSqList(L);
duration=(double)(finish-start)/CLK_TCK;//输出算数时间
printf("\nTheSortSpend:
%lfseconds\n",duration);
}
}
StatusInitSqList(SqList*L){
L->r=(RedType*)malloc((MAXSIZE+1)*sizeof(RedType));//分配内存
if(!
L->r)
exit(OVERFLOW);
L->length=0;
returnOK;
}
StatusCreateSqList(SqList*L){
inti;
srand(time(NULL));
printf("\nPleaseInputtheNumberofUnSortedData:
");
scanf("%d",&L->length);
for(i=1;i<=L->length;i++)
L->r[i].key=rand();//随机产生整数样本
printf("\n\nTheUnSorteddatais:
\n");
for(i=1;i<=L->length;i++)
printf("%8d",L->r[i].key);
printf("\n");
returnOK;
}
StatusCopySqList(SqListL_BAK,SqList*L){
inti;
if(!
L_BAK.length){
printf("TheSqListisEmpty!
");
returnERROR;
}
for(i=1;i<=L_BAK.length;i++)
L->r[i].key=L_BAK.r[i].key;
L->length=L_BAK.length;
returnOK;
}
StatusOutputSqList(SqListL){
inti;
printf("\nTheLengthofSqListis:
%d\n",L.length);
printf("\n\nTheSortedDatais:
\n");
for(i=1;i<=L.length;i++)
printf("%8d",L.r[i]);
printf("\n");
returnOK;
}
intLT(KeyTypee1,KeyTypee2){
if(e1 return1; else return0; } voidSwap(RedType*e1,RedType*e2){ RedTypee; e=*e1; *e1=*e2; *e2=e; } StatusInsertSort(SqList*L){ inti,j; if(! L->length){ printf("TheSqListisEmpty! "); returnERROR; } for(i=2;i<=L->length;i++) if(LT(L->r[i].key,L->r[i-1].key)){ L->r[0]=L->r[i]; L->r[i]=L->r[i-1]; for(j=i-2;LT(L->r[0].key,L->r[j].key);j--) L->r[j+1]=L->r[j]; L->r[j+1]=L->r[0]; } returnOK; } StatusBInsertSort(SqList*L){ inti,j,mid,low,high; if(! L->length){ printf("TheSqListisEmpty! "); returnERROR; } for(i=2;i<=L->length;i++){ L->r[0]=L->r[i]; low=1; high=i-1; while(low<=high){ mid=(low+high)/2; if(LT(L->r[0].key,L->r[mid].key)) high=mid-1; else low=mid+1; } for(j=i-1;j>=high+1;j--) L->r[j+1]=L->r[j]; L->r[high+1]=L->r[0]; } returnOK; } StatusShellInsert(SqList*L,intdk){ inti,j; for(i=dk+1;i<=L->length;i++) if(LT(L->r[i].key,L->r[i-dk].key)){ L->r[0]=L->r[i]; for(j=i-dk;j>0&<(L->r[0].key,L->r[j].key);j-=dk) L->r[j+dk]=L->r[j]; L->r[j+dk]=L->r[0]; } returnOK; } StatusShellSort(SqList*L,intdlta[],intt){ intk; if(! L->length){ printf("TheSqListisEmpty! "); returnERROR; } for(k=0;k ShellInsert(L,dlta[k]); returnOK; } StatusBubbleSort(SqList*L){ inti,j; if(! L->length){ printf("TheSqListisEmpty! "); returnERROR; } for(i=1;i for(j=1;j<=L->length-i;j++) if(! LT(L->r[j].key,L->r[j+1].key)) Swap(&L->r[j],&L->r[j+1]); returnOK; } intPartition(SqList*L,intlow,inthigh){ intpivotkey; L->r[0]=L->r[low]; pivotkey=L->r[low].key; while(low while(low high--; L->r[low]=L->r[high]; while(low low++; L->r[high]=L->r[low]; } L->r[low]=L->r[0]; returnlow; } voidQSort(SqList*L,intlow,inthigh){ intpivotkey; if(low pivotkey=Partition(L,low,high); QSort(L,low,pivotkey-1); QSort(L,pivotkey+1,high); } } StatusQuickSort(SqList*L){ if(! L->length){ printf("TheSqListisEmpty! "); returnERROR; } QSort(L,1,L->length); returnOK; } StatusSelectSort(SqList*L){ inti,j,min; if(! L->length){ printf("TheSqListisEmpty! "); returnERROR; } for(i=1;i min=i; for(j=i+1;j<=L->length-i;j++) if(LT(L->r[j].key,L->r[min].key)) min=j; if(min! =i) Swap(&L->r[i],&L->r[min]); } returnOK; } StatusHeapAdjust(SqList*H,ints,intm){ intj; H->r[0]=H->r[s]; for(j=2*s;j<=m;j*=2){ if(j j++; if(! LT(H->r[0].key,H->r[j].key)) break; H->r[s]=H->r[j]; s=j; } H->r[s]=H->r[0]; returnOK; } StatusHeapSort(SqList*H){ inti; if(! H->length){ printf("TheSqListisEmpty! "); returnERROR; } for(i=H->length/2;i>0;i--) HeapAdjust(H,i,H->length); for(i=H->length;i>1;i--){ Swap(&H->r[1],&H->r[i]); HeapAdjust(H,1,i-1); } returnOK; } StatusMerge(SqList*L,intlow,intmid,inthigh){ inti=low,j=mid+1,k=0;//赋初值 SqListL1;//L1暂存L.r[low..mid]和L.r[mid+1..high]归并后的结果 L1.r=(RedType*)malloc((high-low+1)*sizeof(RedType));//分配内存 if(! L1.r) exit(OVERFLOW); while(i<=mid&&j<=high)//两个子序列非空时,取其小者输出到L1.r[k]上 L1.r[k++]=LT(L->r[i].key,L->r[j].key)? L->r[i++]: L->r[j++]; while(i<=mid)//复制第一个子序列的剩余记录到L1 L1.r[k++]=L->r[i++]; while(j<=high)//复制第二个子序列的剩余记录到L1 L1.r[k++]=L->r[j++]; for(k=0,i=low;i<=high;k++,i++) L->r[i].key=L1.r[k].key;//将归并结果复制回L->r[low..high] returnOK; } voidMSort(SqList*L,intlen){ inti; for(i=1;i+2*len-1<=L->length;i=i+2*len)//归并长度为len的两个相邻的子序列 Merge(L,i,i+len-1,i+2*len-1); if(i+len-1 Merge(L,i,i+len-1,L->length);//归并最后两个子序列 } StatusMergeSort(SqList*L){ intlen; if(! L->length){ printf("TheSqListisEmpty! "); returnERROR; } for(len=1;len MSort(L,len); returnOK; } 结果: 1、样本数量为100时: 依次进行8种排序的执行时间: 2、样本数量为1000时: ...... 8种排序执行时间依次为: 结果分析: 经多次排序发现,8种排序方法存在一定的执行速度差异,但是并不明显,而且其时间复杂度与随机序列情况有关,不同的序列即使样本数相同采用相同的排序方法执行时间也有不同,而同一序列采用不同的排序方法执行时间也可能不同,针对某一特定序列,只有采用其最适合的一种排序方法才会效率最高,而当样本数量较小时由上述实验可知执行时间均为0。 (2)一趟排序(一趟希尔插入排序、一趟快速排序、一趟归并排序) 目录部分: printf("Pleaseselect: \n"); printf("1.ShellInsert\n"); printf("2.Partition\n"); printf("3.MSort\n"); ...... printf("9.Exit\n"); 选项操作: case1: printf("\nNowisinShellInsert......"); start=clock(); ShellInsert(&L,dlta[0]); finish=clock(); break; case2: printf("\nNowisinPartition......"); start=clock(); Partition(&L,1,L.length); finish=clock(); break; case3: printf("\nNowisinMSort......"); start=clock(); MSort(&L,1); finish=clock(); break; ...... default: flag=0; printf("Pressanykeytoexit! \n"); getch(); 执行结果: (1)样本数量为20、一趟希尔排序结果: (2)一趟快速排序: (3)一趟归并排序:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验九 内部排序 实验 内部 排序
![提示](https://static.bdocx.com/images/bang_tan.gif)