排序C语言实验报告.docx
- 文档编号:10896343
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:10
- 大小:95.58KB
排序C语言实验报告.docx
《排序C语言实验报告.docx》由会员分享,可在线阅读,更多相关《排序C语言实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
排序C语言实验报告
排序
数学系李一鹏PB12001076第五组
1.试验题目:
排序
2.实验目的:
掌握各种内部排序思想。
3.实验内容:
每一个在令狐冲身边出现的女性都会在令狐冲心中占有一定“地位”,例如小师妹的地位值是23456,任盈盈的地位值是30000,东方不败的地位值是32767,蓝凤凰的是1234,市集卖菜大妈41,市集路过小姑娘2000……现在令狐冲希望把她们按顺序一个个攻略,请编一个程序,把她们按地位排序。
4.算法思想:
本程序有冒泡,快排,插入,希尔,选择,堆排,归并七个排序。
下面介绍堆排和归并。
堆排:
建堆时先把初态视为只有一个结点的大根堆,每加入一个数据与父结点比较,若父结点小于当前结点则上移,重复操作直至父结点比当前结点大。
排序时交换堆尾与根,堆尾指标前移,根与子结点比较,与大者交换,重复操作直至子结点均小于当前结点。
归并:
把序列半分,先把两个子序列排序,然后用两个指标记录子序列当前最小值,把右指标插入两指标之间的序列,左指标记录为当前插入点的下一个位置,右指标右移。
5.程序清单:
#include
#include
#include
typedefstructdatatype{
intnode,data;
}dtype;
dtypea[1000];
intn,sum1,sum2;//sum1记录比较次数,sum2移动次数
voidreadln(){//用文件读入待排序数据
inti;
FILE*f1;
f1=fopen("a300.txt","r");
fscanf(f1,"%d",&n);
for(i=1;i<=n;i++){
a[i].node=i;
fscanf(f1,"%d",&a[i].data);
}
fclose(f1);
}
voidbubblesort(){//冒泡排序
inti,j;
dtypet;
for(i=n-1;i;i--)
for(j=i;j sum1++; if(a[j].data>a[j+1].data){ t=a[j];a[j]=a[j+1];a[j+1]=t;sum2++; } } } voidqsort(intl,intr){//快速排序 inti,j,m; dtypet; i=l;j=r;m=a[l].data;sum2++; while(i<=j){ while(a[i].data while(a[j].data>m)j--,sum1++; if(i<=j){ t=a[i];a[i]=a[j];a[j]=t; i++;j--;sum2++; } } if(j>l)qsort(l,j); if(i } voidinsertsort(){//插入排序 inti,j,m; for(i=2;i<=n;i++){ a[0]=a[i]; m=a[0].data; j=i-1;sum2++; while(a[j].data>m){ a[j+1]=a[j]; j--;sum1++;sum2++; } a[j+1]=a[0];sum2++; } } voidshellsort(intd){//隔了d个数的插入排序 inti,j,m,k; for(i=1;i<=d;i++) for(j=i+d;j<=n;j+=d){ a[0]=a[j]; m=a[0].data; k=j-d;sum2++; while(k>0&&a[k].data>m){ a[k+d]=a[k]; k-=d;sum2++;sum1++; } a[k+d]=a[0];sum2++; } } voidshells(){//希尔排序 inti,m,d[100]; printf("Inputthesumofyourshellarray: \n"); scanf("%d",&m); printf("Inputyourshellarray: \n"); for(i=1;i<=m;i++) scanf("%d",&d[i]); while(getchar()! =10); for(i=m;i;i--)shellsort(d[i]); } voidselectsort(){//选择排序 inti,j,k,m; dtypet; for(i=1;i m=a[i].data;k=i;sum2++; for(j=i+1;j<=n;j++){ sum1++; if(a[j].data m=a[j].data;k=j; sum2++; } } t=a[k];a[k]=a[i];a[i]=t; sum2++; } } voidcreate(inti){//创建堆 intm; a[0]=a[i];m=a[0].data;sum2++; while(a[i/2].data a[i]=a[i/2]; i/=2;//a[0]起了哨兵作用保证i值不为0 sum1++;sum2++; } a[i]=a[0];sum2++; } voidtreesort(inti){//排序的一步并维护堆 intj,m; a[0]=a[i];m=a[0].data;a[i]=a[1];j=1;i--;sum2++; while(2*j sum1++;sum2++; if(a[2*j].data>m) if(a[2*j+1].data>a[2*j].data){a[j]=a[2*j+1];j=2*j+1;} else{a[j]=a[2*j];j=2*j;} else if(a[2*j+1].data>m){a[j]=a[2*j+1];j=2*j+1;} elsebreak; } if(2*j==i) if(a[2*j].data>m){a[j]=a[2*j];j=2*j;sum2++;} a[j]=a[0];sum2++;sum1++; } voidpilesort(){//堆排序 inti; for(i=2;i<=n;i++)create(i); for(i=n;i>1;i--)treesort(i); } voidmsort(intl,intr){//归并排序 inti,m,mid; mid=(l+r+1)/2; if(mid-1>l)msort(l,mid-1);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 排序 语言 实验 报告