数据结构复习题 第10章2021 12 16

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构复习题第10章2021 12 16
数据结构复习题-第10章2021-12-16
第10章内部排序
一、选择题(每小题2分后,共20分后)
1.从未排序序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后放在
已排序序列的合适位置,该排序方法称为()排序法。

a.插入排序
b.挑选排序
c.希尔排序
d.二路福兰县排序
2.下列排序算法中()排序在一趟结束后不一定能选出一个元素放在其最终位置上。

a.
选择b.冒泡c.归并d.堆3.若一组记录的排序码为(46,79,56,38,40,84),则利用快速
排序的方法,以第一个记录为基准得到的一次划分结果为()。

a.38,40,46,56,79,84
b.40,38,46,79,56,84
c.40,38,
46,56,79,84d.40,38,46,84,56,79
4.排序方法中,从未排序序列中依次取出元素与已排序序列(初始时为空)中的元素
进行比较,将其放入已排序序列的正确位置上的方法,称为()。

a.希尔排序
b.冒泡排序
c.插入排序
d.挑选排序5.为同时实现快速排序算法,等待排
序序列宜使用的存储方式就是()。

a.顺序存储
b.散列存储
c.链式存储
d.索引存储6.若一组记录的排序码为
(46,79,56,38,40,84),则利用堆排序的方法建立的初始堆为()。

a.79,46,56,38,40,84
b.84,79,56,38,40,46
c.84,79,56,46,40,38
d.84,56,79,40,46,38二、判断题(每小题1分后,共10分后)
1.对于n个记录的集合进行快速排序,所需要的平均时间是o(nlogn)。

()
2.(101,88,46,70,34,39,45,58,66,10)是堆。

()三、填空题(每空1分,共10分)
1.不仅须要采用内存,而且还要采用外存的排序称作。

2.若不考虑基数排序,则在排序过程中,主要进行的两种基本操作是关键字的和记录的。

四、应用题(共40分后)
1.(6分)简述快速排序算法的基本思想。

2.(6分后)写下快速排序的思想,并写下以下序列快速排序的结果(49,38,65,97,76,13,27,50)
3.(6分)对一组记录(54,38,96,23,15,72,60,45,83)执行希尔排序(d=5,3,1),记录每一趟排序结果。

4.(6分后)对一组记录(54,38,96,23,15,72,60,45,83)继续执行冒泡排序,记录每一趟排序结果。

5.(6分)已知一组元素的排序码为(36,25,48,12,65,20),写出用直接插入
排序法每次向前面有序表插入一个元素后的排列结果。

6.(6分后)写下用堆排序算法对(12,15,3,30,28,9)展开排序时,起始特阿莱县以后每通心面一个元素再次调整后堆的状态。

7.(6分)判断下列序列是否是堆(可以是小堆,也可以是大堆,若不是堆,请将它
们调整为堆)。

(1)100,85,98,77,80,60,82,40,20,10,66(2)100,85,40,77,80,60,66,98,82,10,20
1
(3)10,20,40,60,66,77,80,82,85,98,100
8.(6分)画出向小根堆中加入数据4,2,5,8,3时,每加入一个数据后堆的变化。

五、
算法题(共20分)
1.(6分后)撰写腹满排序的算法。

2.(6分)写出一趟快速排序的算法。

3.(6分)编写直接插入排序的算法。

4.(6分)编写折半插入排序的算法。

5.(6分)编写简单选择排序的算法。

6.(6分)编写归并排
序的算法。

(可选)
答案:
一、选择题1-6acccab二、判断题1-2对对
三、填空题1.外部排序2.比较、移动四、应用题并无答案五、算法题
1.(6分)编写起泡排序的算法。

答案一:
voidbubblesort(elemr[],intn){i=n;
while(i>1){
lastexchangeindex=1;
for(j=1;j<i;j++)if(r[j+1].key<r[j].key){
swap(r[j],r[j+1]);//temp=r[j];r[j]=r[j+1];r[j+1]=temp;lastexchangeindex=j;//记
下展开互换的记录边线}//if
i=lastexchangeindex;//本趟进行过交换的最后一个记录的位
置}//while}//bubblesort答案二:
voidpaixu(inta[],intn){
for(i=0;i{for(i=0;i<10-j;i++)2分
if(a[i]>a[i+1]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;}}6分
for(i=1;i<11;i++)2printf(\printf(\}2.(6分)写出一趟快速排序的算法。

intpartition(sqlistl,intlow,inthigh){l.r[0]=l.r[low];pivotkey=l.r[low].key;1分while(low{while(low=pivotdey)chigh;l.r[low]=l.r[high];3分
while(low}l.r[low]=l.r[0];returnlow;7分}3.(6分)编写直接插入排序的算法。

voidinsertionsort(sqlist&l){//对顺序表l作直接插入排序。

for(i=2;i<=l.length;++i)if(l.r[i].key<l.r[i-1].key){l.r[0]=l.r[i];//复制为监视
哨for(j=i-1;l.r[0].key<l.r[j].key;--j)l.r[j+1]=l.r[j];//记录后移
l.r[j+1]=l.r[0];//插入到正确位置}}//insertsort4.(6分)编写折半插入排序的算法。

voidbiinsertionsort(sqlist&l){for(i=2;i<=l.length;++i){l.r[0]=l.r[i];//将l.r[i]暂存到l.r[0]low=1;high=i-1;while(low<=high){m=(low+high)/2;//折半
if(l.r[0].key<l.r[m].key)high=m-1;//插入点在低半区elselow=m+1;//插入点在高半区}//在l.r[1..i-1]中折半查找插入位置;for(j=i-1;j>=high+1;--
j)l.r[j+1]=l.r[j];//记录后移l.r[high+1]=l.r[0];//插入}//for}//binsertsort35.
(6分)编写简单选择排序的算法。

voidselectsort(intr[],intn){//对记录序列r[1..n]作简单选择排序。

for(i=1;i//选择第i小的记录,并交换到位j=selectminkey(r,i);//
在r[i..n]中选择关键字最小的记录if(i!=j)r[i]←→r[j];//与第i个记录交
换}}//selectsort6.(6分)编写归并排序的算法。

(可选)
voidmerge(intr[],intr2[],intl,intm,inth){//将有序的记录序列r[l..m]和
r[m+1..h]//归并为有序的记录序列r2[l..h]for(i=l,j=m+1;i<=m&&j<=h;++k){//将r中
记录由小到大地并入
r2if(r[i]<=r[j])r2[k]=r[i];elser2[k]=r[j];}if(i<=m)r[k..h]=r[i..m];//将剩余的
r[i..m]复制到r2if(j<=h)r2[k..h]=r[j..h];//将剩余的r[j..h]复制到r2}//merge4。

相关文档
最新文档