数据结构 第8章答案已核.docx
- 文档编号:28627985
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:29
- 大小:20.63KB
数据结构 第8章答案已核.docx
《数据结构 第8章答案已核.docx》由会员分享,可在线阅读,更多相关《数据结构 第8章答案已核.docx(29页珍藏版)》请在冰豆网上搜索。
数据结构第8章答案已核
8.8习题
一、名词解释
(1)排序:
排序又称分类,是对一个数据元素集合或序列重新排列成一个按数据元素某个项值有序的序列。
(2)稳定排序:
按关键码进行排序:
若相同关键码元素间的位置关系,排序前与排序后保持一致,称此排序方法是稳定的。
(3)不稳定排序:
按关键码进行排序:
若相同关键码元素间的位置关系,排序前与排序后不能保持一致,称此排序方法是不稳定的。
(4)内排序:
在排序过程中,若整个文件都是放在内存中处理,排序时不涉及数据的内、外存交换,则称之为内部排序(简称内排序)。
(5)外排序:
若排序过程中要进行数据的内、外存交换,则称之为外部排序(简称外排序)。
二、判断题
1
2
3
4
5
×
√
×
√
×
(1)堆排序是一种稳定的排序算法。
(×)
解析:
无论规模大小,效率都比较稳定,但是属于不稳定排序
(2)当输入序列已经有序时,冒泡排序需要的排序码比较次数比快速排序要少。
(√)
(3)若将一批杂乱无章的数据按堆结构组织起来, 则堆中各数据是否必然按自小到大的顺序排列起来。
(×)
(4)任何基于排序码比较的算法,对n个数据对象进行排序时,最坏情况下的时间复杂度不会低于O(nlog2n)。
(√)
(5)简单选择排序是一种稳定的排序方法。
(×)
三、填空题
第1空
第2空
第3空
第4空
第5空
比较
移动
3
插入排序
选择排序
第6空
第7空
第8空
第9空
第10空
堆排序
快速排序
O(n2)
O(n2)
O(nlog2n)
第11空
第12空
第13空
第14空
第15空
O(n)
┌log2n┐
HCQPAMSRDFXY
HQCYAPMSDRFX
FHCDPAMQRSYX
第16空
第17空
第18空
第19空
YSXRPCMHQDFA
归并排序
快速排序
堆排序
四、选择题
1
2
3
4
5
C
D
B
D
C
6
7
8
9
10
A
C
C
D
B
11
12
13
C
B
C
五、编程
(1)编写程序,实现直接插入排序。
#include
#defineMAXE20/*线性表中最多元素个数*/
typedefintKeyType;
typedefcharInfoType[10];
typedefstruct/*记录类型*/
{
KeyTypekey;/*关键字项*/
InfoTypedata;/*其他数据项,类型为InfoType*/
}RecType;
voidInsertSort(RecTypeR[],intn)/*对R[0..n-1]按递增有序进行直接插入排序*/
{
inti,j,k;
RecTypetemp;
for(i=1;i { temp=R[i]; j=i-1;/*从右向左在有序区R[0..i-1]中找R[i]的插入位置*/ while(j>=0&&temp.key { R[j+1]=R[j];/*将关键字大于R[i].key的记录后移*/ j--; } R[j+1]=temp;/*在j+1处插入R[i]*/ printf("i=%d",i);/*输出每一趟的排序结果*/ for(k=0;k printf("%3d",R[k].key); printf("\n"); } } voidmain() { inti,k,n=10; KeyTypea[]={9,8,7,6,5,4,3,2,1,0}; RecTypeR[MAXE]; for(i=0;i R[i].key=a[i]; printf("\n"); printf("初始关键字");/*输出初始关键字序列*/ for(k=0;k printf("%3d",R[k].key); printf("\n"); InsertSort(R,n); printf("最后结果");/*输出初始关键字序列*/ for(k=0;k printf("%3d",R[k].key); printf("\n\n"); } (2)编写程序,实现冒泡排序。 #include voidmain() { inta[5]; inti; intj; intk; inttemp; for(k=0;k<5;k++) scanf("%d",&a[k]); for(i=0;i<5;i++) for(j=0;j<5-i;j++) { if(a[j]>a[j+1]) { temp=a[j+1]; a[j+1]=a[j]; a[j]=temp; } } for(i=0;i<5;i++) { printf("%d",a[i]); } } (3)编写程序,实现简单选择排序。 #include #include inta[10]={1,4,3,5,23,2,45,6,3,5}; main() { inti,j,min,pos,mid; //每次外循环结束后确定数组中第i个数是i~length的最小的数字 for(i=0;i<=9;i++) { min=9999; //寻找剩下数组的最小值,与第i个数进行交换 for(j=i;j<=9;j++) { if(a[j] { min=a[j]; pos=j; } } mid=a[pos]; a[pos]=a[i]; a[i]=mid; } for(i=0;i<=9;i++) printf("%d",a[i]); system("pause"); } (4)编写程序,实现快速排序。 #include typedefintnode; nodeafile[20]; nodex; intd,dl,n; intl,r,i,j; voidq(intl,intr){ intp; d++; if(dl dl=d; printf("dl=%d",dl); printf("d=%d\n",d); if(l i=l;j=r; x=afile[i]; while(i! =j){ while((afile[j]>x)&&(j>i)) j--; if(i afile[i++]=afile[j]; while((afile[i] i++; if(i afile[j--]=afile[i]; } afile[i]=x; for(p=1;p<=n;p++) printf("%d,",afile[p]); printf("\n"); q(l,i-1); q(i+1,r); } d--; printf("**%d**\n",d); } main() {intp; printf("\nPleaseinputn: \n"); scanf("%d",&n); printf("Pleaseinputastring: "); for(p=1;p<=n;p++) scanf("%d",&(afile[p])); d=0;dl=0; l=1;r=n; q(l,r); for(p=1;p<=n;p++) printf("%d,",afile[p]); printf("\n"); printf("dl=%d\n",dl); } (5)编写程序,实现堆排序。 #include #include #defineN10 inta[]={4,10,11,34,2,1,12,18,9,8}; voidadjustMinHeap(int*a,intpos,intlen){ inttemp; intchild; for(temp=a[pos];2*pos+1<=len;pos=child){ child=2*pos+1; if(child child++; if(a[child] 。 。 a[pos]=a[child]; } else{ break; } } a[pos]=temp; } voidminHeapSort(int*a){ inti; for(i=N/2-1;i>=0;i--) adjustMinHeap(a,i,N-1); for(i=N-1;i>=0;i--){ //printf("%d",a[0]); inttemp=a[0]; a[0]=a[i]; a[i]=temp; adjustMinHeap(a,0,i-1); } } intmain(){ minHeapSort(a); for(inti=0;i printf("%d",a[i]); printf("\n"); return0; } (6)编写程序,实现二路归并排序。 #include #include #defineMAXE20/*线性表中最多元素个数*/ typedefintKeyType; typedefcharInfoType[10]; typedefstruct/*记录类型*/ { KeyTypekey;/*关键字项*/ InfoTypedata;/*其他数据项,类型为InfoType*/ }RecType; voidMerge(RecTypeR[],intlow,intmid,inthigh) /*将两个有序表R[low..mid]和R[mid+1..high]归并为一个有序表R[low..high]中*/ { RecType*R1; inti=low,j=mid+1,k=0;/*k是R1的下标,i、j分别为第1、2段的下标*/ R1=(RecType*)malloc((high-low+1)*sizeof(RecType));/*动态分配空间*/ while(i<=mid&&j<=high)/*在第1段和第2段均未扫描完时循环*/ if(R[i].key<=R[j].key)/*将第1段中的记录放入R1中*/ { R1[k]=R[i]; i++;k++; } else/*将第2段中的记录放入R1中*/ { R1[k]=R[j]; j++;k++; } while(i<=mid)/*将第1段余下部分复制到R1*/ { R1[k]=R[i]; i++;k++; } while(j<=high)/*将第2段余下部分复制到R1*/ { R1[k]=R[j]; j++;k++; } for(k=0,i=low;i<=high;k++,i++)/*将R1复制回R中*/ R[i]=R1[k]; } voidMergePass(RecTypeR[],intlength,intn)/*实现一趟归并*/ { inti; for(i=0;i+2*length-1 Merge(R,i,i+length-1,i+2*length-1); if(i+length-1 Merge(R,i,i+length-1,n-1);/*归并这两个子表*/ } voidMergeSort(RecTypeR[],intn)/*二路归并排序算法*/ { intlength,k,i=1;/*i用于累计归并的趟数*/ for(length=1;length { MergePass(R,length,n); printf("第%d趟归并",i++);/*输出每一趟的排序结果*/ for(k=0;k printf("%4d",R[k].key); printf("\n"); } } voidmain() { inti,k,n=8; KeyTypea[]={18,2,20,34,12,32,6,16}; RecTypeR[MAXE]; for(i=0;i R[i].key=a[i]; printf("\n"); printf("初始关键字");/*输出初始关键字序列*/ for(k=0;k printf("%4d",R[k].key); printf("\n"); MergeSort(R,n); printf("最后结果");/*输出初始关键字序列*/ for(k=0;k printf("%4d",R[k].key); printf("\n\n"); } (7)编写程序,将上面的各个排序算法合并在一个综合程序中。 #include"stdlib.h" #include #defines100 typedefstructrecord {intkey;}; staticstructrecorda1[s],a2[s],a3[s],a4[s],a5[s],a6[s],rec; inta[7],b[7]; file() { 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");} voidStraight_insert_sort(r,n)/*直接插入*/ structrecordr[]; intn; {inti,j; a[1]=0;b[1]=0; for(i=1;i<=n;i++) printf("%4d",r[i].key); printf("\n"); for(i=2;i<=n;i++) {r[0]=r[i]; j=i-1; while((j>=0)&&(r[0].key {b[1]++; r[j+1]=r[j--]; r[j+1]=r[0]; a[1]=a[1]+2; } } printf("************直接插入******************\n"); for(i=1;i<=n;i++) printf("%4d",r[i]); printf("\n"); printf("move: %dtime,compete: %dtime",a[1],b[1]); printf("\n"); } voidShell_sort(r,n)/*希尔排序*/ structrecordr[]; intn; {structrecordrec,temp; inti,j,t,h; a[2]=0;b[2]=0; for(i=1;i<=n;i++) printf("%4d",r[i].key); printf("\n"); t=n/2; while(t>=1) {h=t; for(j=h;j {rec=r[j]; i=j-h; while((i>=0)&&(r[i].key>rec.key)) {b[3]++; temp=r[i+h]; r[i+h]=r[i]; r[i]=temp; i=i-h; a[2]=a[2]+3; } } t=t/2; b[2]++; } printf("************************希尔排序**************************\n"); for(i=0;i printf("%4d",r[i]); printf("\n"); printf("move: %dtime,compete: %dtime",a[3],b[3]); printf("\n"); } voidBubblle_sort(r,n)/*冒泡排序*/ structrecordr[]; intn; {structrecordrec; inti,j,m,flag; a[3]=0;b[3]=0; for(i=1;i<=n;i++) printf("%4d",r[i].key); printf("\n"); m=n; flag=1; for(i=1;i<=m-1;i++) {flag=0; for(j=0;j<=m-i-1;j++) if(r[j].key>r[j+1].key) {b[3]++; rec.key=r[j].key; r[j].key=r[j+1].key; r[j+1].key=rec.key; a[3]=a[3]+3; flag=1; } if(flag==0)break; } printf("*************冒泡排序****************\n"); for(i=0;i printf("%4d",r[i].key); printf("\n"); printf("move: %dtime,compete: %dtime",a[3],b[3]); printf("\n"); } intpush(h,top,m,n) inth[]; inttop,m,n; {h[++top]=m; h[++top]=n; return(top); } intpop(h,top,m,n) inth[],top,*m,*n; {*m=h[top--]; *n=h[top--]; return(top); } intquick(r,i,j) structrecordr[]; inti,j; { rec=r[i]; while(i {while((i j--; b[4]++; if(i r[i++]=r[j]; a[4]++; while((i i++; b[4]++; if(i r[j--]=r[i]; a[4]++; } r[i]=rec; a[4]++; return(i); } voidQuick_sort(r,l,h)/*快速排序*/ structrecordr[]; intl,h; {intss[s]; inttop,i,j,k; for(i=1;i<=s;i++) printf("%4d",r[i].key); printf("\n"); i=l; j=h; top=-1; do {while(i {k=quick(r,i,j); if(j-k>1) top=push(ss,top,k+1,j); j=k-1; } if(top>0) top=pop(ss,top,&j,&i); } while((top>=0)||(i printf("**************************快速排序*************************\n"); for(i=1;i<=s;i++) printf("%4d",r[i].key); printf("\n"); printf("move: %dtime,compete: %dtime",a[4],b[4]); } voidSimple_select_sort(r,n)/*简单选择排序*/ structrecordr[]; intn; { inti,j,m; a[5]=0;b[5]=0; for(i=1;i<=n;i++) printf("%4d",r[i].key); printf("\n"); for(i=1;i<=n-1;i++) {m=i; for(j=i+1;j<=n;j++) if(r[j].key m=j; b[5]++; if(i! =m) {rec=r[i]; r[i]=r[m]; r[m]=rec; a[5]=a[5]+3; } } printf("************************简单选择************************\n"); for(i=1;i<=s;i++) printf("%4d",r[i].key); printf("\n"); printf("move: %dtime,compete: %dtime",a[5],b[5]); printf("\n"); } voidp(r,n)/*次数排列*/ intr[]; intn; {intrec; inti,j; for(i=1;i<=n;i++) {rec=r[i]; j=i-1; while((j>0)&&(rec {r[j+1]=r[j]; j=j-1; } r[j+1]=rec;} if(r==a) printf("关键字移动次数排列: \n");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第8章答案已核 答案
![提示](https://static.bdocx.com/images/bang_tan.gif)