数据结构实验八 庞云杰5653.docx
- 文档编号:27489726
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:16
- 大小:173.16KB
数据结构实验八 庞云杰5653.docx
《数据结构实验八 庞云杰5653.docx》由会员分享,可在线阅读,更多相关《数据结构实验八 庞云杰5653.docx(16页珍藏版)》请在冰豆网上搜索。
数据结构实验八庞云杰5653
实验八:
排序
班级:
信计1502学号:
20155653姓名:
庞云杰日期:
2017.06.22
一、实验题目
请编制C程序,完成下列实验。
(1)掌握在数组上进行各种排序的方法和算法。
(2)理解各种方法的特点,并能加以灵活应用。
(3)加深对排序的理解,逐步培养解决实际问题的编程能力。
二、需求分析
本演示程序在VC++6.0环境下编写调试。
根据各个排序的算法对无序的数据进行排序。
三、概要设计
对一组数据进行直接插入排序、冒泡排序及直接选择排序。
四、详细设计
实现各个算法的主要内容,下面是各个函数的主要信息:
(1)各个排序函数的算法:
一、希尔排序
voidShellSort(SqList&L)
{
inti,j;
intdk=1;//增量
while(dk<=L.length/3)
dk=3*dk+1;//增大增量
while(dk>0)
{
dk/=3;//减小增量
for(i=dk;i<=L.length;i++)
{
L.r[0].key=L.r[i].key;
j=i;
while((j>=dk)&&(L.r[j-dk].key>L.r[0].key))
{
L.r[j].key=L.r[j-dk].key;
j-=dk;
}
L.r[j].key=L.r[0].key;
}
}
}
二、冒泡排序
voidBubbleSort(SqList&L)
{
inti,j;
for(i=0;i { intflag=1; for(j=0;j if(L.r[j].key>L.r[j+1].key) { flag=0; inttemp; temp=L.r[j].key; L.r[j].key=L.r[j+1].key; L.r[j+1].key=temp; } //若无交换说明已经有序 if(flag==1) break; } } 三、快速排序 intPartition(SqList&L,intlow,inthigh) { //分割区域函数 L.r[0]=L.r[low]; intpivotkey=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) { //每张子表的快速排序 if(low { intpivotloc=Partition(L,low,high); QSort(L,low,pivotloc-1); QSort(L,pivotloc+1,high); } } voidQuickSort(SqList&L) { QSort(L,1,L.length); } 四、简单选择排序 voidSelectSort(SqList&L) { intmin; intj; for(inti=0;i {//选择第i小的记录,并交换 j=i; min=L.r[i].key; for(intk=i;k {//在R[i..n-1]中选择最小的记录 if(L.r[k].key { min=L.r[k].key; j=k; } } if(i! =j) {//与第i个记录交换 inttemp=L.r[i].key; L.r[i].key=L.r[j].key; L.r[j].key=temp; } } } 五、调试分析 程序运行正常。 六、使用说明、测试结果 利用源程序,编辑程序,运行环境为VC++。 程序测试如下: 七、源程序 #include #include #include #include #include #include typedefintKeyType;//关键字为整型 typedefintOtherType;//关键字为整型 typedefstruct { KeyTypekey;//关键字为KeyType型 OtherTypeother_data; }RecordType;//定义一个RecordType型结构体,存放关键字 /*快速排序模块: */ voidquicksort(RecordTypea[],intleft,intright) { RecordTypet; inti,j,temp; if(left>right) return; temp=a[left].key; i=left; j=right; while(i! =j) { while(a[j].key>=temp&&i j--; while(a[i].key<=temp&&i i++; if(i { t=a[i]; a[i]=a[j]; a[j]=t; } } a[left]=a[i]; a[i].key=temp; quicksort(a,left,i-1);//继续处理左边的,这是一个递归的过程 quicksort(a,i+1,right);//继续处理右边的,这是一个递归的过程 }/*快速排序算法*/ /*冒泡排序模块: */ //此处是一次冒泡排序过程,在主函数中会通过循环调用此冒泡函数过程 voidbubbleSort(RecordTypea[],intlength) { inti,temp; for(i=1;i { if(a[i].key>a[i+1].key) { temp=a[i].key; a[i].key=a[i+1].key; a[i+1].key=temp; } } }/*冒泡排序算法*/ /*希尔排序模块: */ voidshellSort(RecordTypea[],intn) { inti,j,temp; intgap=0; while(gap<=n)//根据待排序的个数生成合适的步长,gap是步长 { gap=gap*3+1; } while(gap>0) { for(i=gap;i { j=i-gap; temp=a[i+1].key; while((j>=0)&&(a[j+1].key>temp)) { a[j+gap+1].key=a[j+1].key; j=j-gap; } a[j+gap+1].key=temp; } gap=(gap-1)/3; } } /*希尔折半插入排序模块: */ /*折半插入排序法*/ voidBinSort(RecordTyper[],intlength) /*对记录数组r进行折半插入排序,length为数组的长度*/ { inti,j; RecordTypex; intlow,high,mid; for(i=2;i<=length;++i) { x=r[i]; low=1;high=i-1; while(low<=high)/*确定插入位置*/ { mid=(low+high)/2; if(x.key high=mid-1; else low=mid+1; } for(j=i-1;j>=low;--j)r[j+1]=r[j];/*记录依次向后移动*/ r[low]=x;/*插入记录*/ } }/*BinSort*/ /*主函数模块: */ voidmain() { intn,i,j,t; charb; boolq=false; RecordTypea[40000]; while (1) { printf("\n\n"); printf("**************综合排序*****************************\n\n"); printf("*********************菜单***************************\n\n"); printf("*=====================================*\n"); printf("*1.读取待排序长度*\n"); printf("*2.产生随机数并输出*\n"); printf("*3.采用快速排序法排序*\n"); printf("*4.采用冒泡排序法排序*\n"); printf("*5.采用希尔排序法排序*\n"); printf("*6.采用折半插入排序法排序*\n"); printf("*7.输出*\n"); printf("*0.退出系统*\n"); printf("*-------------------------------------*\n"); printf("请输入你要进行的操作"); b=getch(); switch(b) { case'1': printf("%c\n",b); printf("请输入待排序记录的长度: "); scanf("%d",&n);break; case'2': printf("%c\n",b); srand((unsigned)time(NULL)); printf("下面随机生成%d个数字存储在数组中\n",n); for(i=1;i<=n;i++) { a[i].key=rand()%20000; printf("%d\t",a[i].key); if(i%100==0) printf("\n"); } printf("\n"); break; case'3': printf("%c\n",b); printf("\n-----------------快速排序结束-------------------\n\n"); quicksort(a,1,n); q=true;break; case'4': printf("%c\n",b); for(i=0;i { bubbleSort(a,n-i); } printf("\n-----------------冒泡排序结束-------------------\n\n"); q=true;break; case'5': printf("%c\n",b); printf("\n-----------------希尔排序结束-------------------\n\n"); shellSort(a,n); q=true;break; case'6': printf("%c\n",b); BinSort(a,n); printf("\n-----------------折半插入排序结束-------------------\n\n"); q=true;break; case'7': printf("%c\n",b); if(q) { printf("\n-----------------排序后输出-------------------\n"); for(i=1;i<=n;i++) { printf("%d\t",a[i].key); if(i%100==0) printf("\n"); } } else { printf("\n*=======================================================*\n"); printf("*您未对待排序数据排序*\n"); printf("*请重新选择排序的序号*\n"); printf("*-------------------------------------------------------*\n"); } break; case'0': printf("%c\n",b); printf("\n感谢使用综合排序程序\n按任意键退出......\n"); return;break; default: printf("输入错误请重新输入\n\n"); } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构实验八 庞云杰5653 数据结构 实验 庞云杰 5653
![提示](https://static.bdocx.com/images/bang_tan.gif)