源程序清单.docx
- 文档编号:30271943
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:17
- 大小:17.46KB
源程序清单.docx
《源程序清单.docx》由会员分享,可在线阅读,更多相关《源程序清单.docx(17页珍藏版)》请在冰豆网上搜索。
源程序清单
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"time.h"
#defineSIZE20000
intc1=0,m1=0,c2=0,m2=0,c3=0,m3=0,c4=0,m4=0,c5=0,m5=0,c6=0,m6=0,c7=0,m7=0,c8=0,m8=0,n;//c,m为记录关键字比较和移动的次数
typedefstruct
{
intkey;
}ElemType;
typedefstruct
{
ElemType*elem;
intlength;
}SqList;
voidaddlist(SqList&L)//初始化顺序表
{
printf("请输入你要输入的个数:
");
scanf("%d",&n);
while(n>20000)
{
printf("超出范围(应小于20000),请重新输入!
!
!
\n");
printf("请输入你要输入的个数:
");
scanf("%d",&n);
}
L.elem=(ElemType*)malloc(SIZE*sizeof(ElemType));
if(!
L.elem)exit(0);
}
voidrandom(SqList&L)//随机数产生程序
{
inti,first=1;
L.length=0;
if(first)
{
srand(time(0));
first=0;
}
for(i=1;i { L.elem[i].key=rand(); while(L.elem[i].key>20000) { L.elem[i].key=rand(); } ++L.length; } } voidmemory(SqList&M,SqList&L)//记录L,使每个排序算法都用一组相同的随机数 { inti; M.length=0; for(i=1;i { M.elem[i].key=L.elem[i].key; ++M.length; } } /***************冒泡排序***************/ voidBubbleSort(SqList&L) { inti,j; for(i=1;i { for(j=1;j { c1++; if(L.elem[j].key>L.elem[j+1].key) { L.elem[0].key=L.elem[j].key; L.elem[j].key=L.elem[j+1].key; L.elem[j+1].key=L.elem[0].key; m1+=3; } } } } /***************直接插入排序***************/ voidInsertSort(SqList&L) { inti,j; for(i=2;i<=L.length;i++) { if(L.elem[i].key { L.elem[0].key=L.elem[i].key; m2++; j=i-1; c2++; while(L.elem[0].key { L.elem[j+1].key=L.elem[j].key; j--; m2++; c2++; } L.elem[j+1].key=L.elem[0].key; m2++; } } } /***************简单选择排序***************/ voidSelectSort(SqList&L) { inti,j,k; for(i=1;i { k=i; for(j=i+1;j { c3++; if(L.elem[j].key } if(i! =k) { L.elem[0].key=L.elem[i].key; L.elem[i].key=L.elem[k].key; L.elem[k].key=L.elem[0].key; m3+=3; } } } /***************快速排序***************/ intPartition(SqList&L,intlow,inthigh) { intpivotkey; L.elem[0]=L.elem[low]; m4++; pivotkey=L.elem[low].key; while(low { m4++; while(low --high; L.elem[low]=L.elem[high]; c4++; m4++; while(low ++low; L.elem[high]=L.elem[low]; c4++; m4++; } L.elem[low]=L.elem[0]; m4++; returnlow; } voidQSort(SqList&L,intlow,inthigh) {//对顺序表的子序列作快速排序 intpivotloc; if(low { pivotloc=Partition(L,low,high); QSort(L,low,pivotloc-1); QSort(L,pivotloc+1,high); } } voidQuickSort(SqList&L) {//对顺序表L作快速排序 QSort(L,1,L.length); } /***************希尔排序***************/ voidShellPass(SqList&L,intd) {//希尔排序中的一趟排序,d为当前增量 inti,j; for(i=d+1;i<=n;i++)//将L.elem[d+1..n]分别插入各组当前的有序区 { if(L.elem[i].key { L.elem[0]=L.elem[i]; j=i-d; m5++; do{//查找L.elem[i]的插入位置 L.elem[j+d]=L.elem[j];//后移记录 m5++;c5++; j=j-d;//查找前一记录 }while(j>0&&L.elem[0].key L.elem[j+d]=L.elem[0];//插入L.elem[i]到正确的位置上 m5++; } c5++; } } voidShellSort(SqList&L) { do{ L.length=L.length/2;//求下一增量 ShellPass(L,L.length);//一趟增量为L.length的Shell插入排序 }while(L.length>1); } /*****************堆排序*****************/ voidAdjustHeap(SqList&L,inthLen,inti) { intleft=2*i;//节点i的左孩子 intright=2*i+1;//节点i的右孩子节点 intlargest=i; while(left { if(left { largest=left; } c6++; if(right { largest=right; } c6++; if(i! =largest)//如果最大值不是父节点 { L.elem[0]=L.elem[largest];//交换父节点和和拥有最大值的子节点交换 L.elem[largest]=L.elem[i]; L.elem[i]=L.elem[0]; m6+=3; i=largest;//新的父节点,以备迭代调堆 left=2*i;//新的子节点 right=2*i+1; } else { break; } } } voidBuildHeap(SqList&L,inthLen)//建堆 { inti; intbegin=hLen/2;//最后一个非叶子节点 for(i=begin;i>=0;i--) { AdjustHeap(L,hLen,i); } } voidHeapSort(SqList&L) { inthLen=L.length; BuildHeap(L,hLen);//建堆 while(hLen>=1) { L.elem[0]=L.elem[hLen];//交换堆的第一个元素和堆的最后一个元素 L.elem[hLen]=L.elem[1]; L.elem[1]=L.elem[0]; m6+=3; hLen--;//堆的大小减一 AdjustHeap(L,hLen,1);//调堆 } } /***************折半插入排序***************/ voidBInsertSort(SqList&L) { inti,low,high,m,j; for(i=2;i<=L.length;++i) { L.elem[0]=L.elem[i]; c7++; m7++; low=1; high=i-1; while(low<=high) { m=(low+high)/2; if(L.elem[0].key high=m-1; elselow=m+1; c7++; } for(j=i-1;j>=high+1;--j) { L.elem[j+1]=L.elem[j]; m7++; } L.elem[high+1]=L.elem[0]; m7++; } } /*****************归并排序*****************/ voidmerge(SqList&L,SqList&L1,intlow,intmid,inthigh) { inti,j,k; i=low;j=mid+1;k=low; while((i<=mid)&&(j<=high)) { if(L.elem[i].key<=L.elem[j].key) L1.elem[k++]=L.elem[i++]; else L1.elem[k++]=L.elem[j++]; c8++;m8++; } while(i<=mid) { L1.elem[k++]=L.elem[i++]; m8++; } while(j<=high) { L1.elem[k++]=L.elem[j++]; m8++; } } voidmergepass(SqList&L,SqList&L1,intl) { inti,j; i=0; while(i+2*l-1 { merge(L,L1,i,i+l-1,i+2*l-1); i=i+2*l; } if((i+l-1)<(L.length-1)) merge(L,L1,i,i+l-1,L.length-1); else for(j=i;j L1.elem[j++]=L.elem[j++]; } voidMergeSort(SqList&L) { SqListL1; L1.elem=(ElemType*)malloc(SIZE*sizeof(ElemType)); intl; l=1; while(l { mergepass(L,L1,l); l=2*l; mergepass(L1,L,l); l=2*l; } free(L1.elem); } voidmain() { printf("---------------------------------内部排序算法比较-----------------------------\n"); printf("************************************欢迎使用***********************************\n"); printf("********************************** (1)运行程序**********************************\n"); printf("**********************************(0)退出系统**********************************\n"); while (1) { FILE*fp; SqListL,M; intchoose,i; M.elem=(ElemType*)malloc(SIZE*sizeof(ElemType)); if(! M.elem)exit(0); printf("请选择: "); scanf("%d",&choose); switch(choose) { case1: addlist(L); random(L); fp=fopen("f: \\input.txt","w+");//将产生的随机数存到文件open.txt中 if(fp==NULL) { printf("文件打开失败\n"); fclose(fp); exit (1); } for(i=1;i<=L.length;i++) { fprintf(fp,"%-10d",L.elem[i].key); if(i%10==0) fprintf(fp,"\n"); } fprintf(fp,"\n\n"); fclose(fp); memory(M,L); BubbleSort(M); memory(M,L); InsertSort(M); memory(M,L); SelectSort(M); memory(M,L); QuickSort(M); memory(M,L); ShellSort(M); memory(M,L); HeapSort(M); memory(M,L); BInsertSort(M); memory(M,L); MergeSort(L); printf("*********比较次数**********移动次数*********\n"); printf("冒泡排序: %10d%10d\n",c1,m1); printf("直接插入: %10d%10d\n",c2,m2); printf("简单选择: %10d%10d\n",c3,m3); printf("快速排序: %10d%10d\n",c4,m4); printf("希尔排序: %10d%10d\n",c5,m5); printf("堆排序: %10d%10d\n",c6,m6); printf("折半插入: %10d%10d\n",c7,m7); printf("归并排序: %10d%10d\n",c8,m8); if((fp=fopen("f: \\out.txt","w+"))==NULL)//各个算法的关键字比较次数和关键字移动次数保存到Out.txt文件中 { printf("文件打开失败\n"); fclose(fp); exit (1); } fprintf(fp,"*********比较次数**********移动次数*********\n"); fprintf(fp,"冒泡排序: %10d%10d\n",c1,m1); fprintf(fp,"直接插入: %10d%10d\n",c2,m2); fprintf(fp,"简单选择: %10d%10d\n",c3,m3); fprintf(fp,"快速排序: %10d%10d\n",c4,m4); fprintf(fp,"希尔排序: %10d%10d\n",c5,m5); fprintf(fp,"堆排序: %10d%10d\n",c6,m6); fprintf(fp,"折半插入: %10d%10d\n",c7,m7); fprintf(fp,"归并排序: %10d%10d\n",c8,m8); fprintf(fp,"\n\n"); fclose(fp); c1=0;m1=0;c2=0;m2=0;c3=0;m3=0;c4=0;m4=0;c5=0;m5=0;c6=0;m6=0;c7=0;m7=0;c8=0;m8=0; break; case0: printf("谢谢使用\n"); exit(0); break; default: printf("输入有问题,请重新输入! \n"); } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 源程序 清单