归并排序上机题

合集下载

计算机专业基础综合数据结构(排序)模拟试卷2(题后含答案及解析)

计算机专业基础综合数据结构(排序)模拟试卷2(题后含答案及解析)

计算机专业基础综合数据结构(排序)模拟试卷2(题后含答案及解析)题型有:1. 单项选择题 2. 综合应用题单项选择题1-40小题,每小题2分,共80分。

下列每题给出的四个选项中,只有一个选项是最符合题目要求的。

1.采用简单选择排序,比较次数与移动次数分别为( )。

A.O(n),O(log2n)B.O(log2n),O(n2)C.O(n2),O(n)D.O(nlog2n),O(n)正确答案:C解析:简单选择排序的关键字比较次数KCN与对象的初始排列无关。

第i 趟选择具有最小关键字对象所需的比较次数总是n—i—1次(此处假定整个待排序对象序列有n个对象)。

因此,总的关键字比较次数为:最坏情况是每一趟都要进行交换,总的对象移动次数为RMN=3(n一1)。

知识模块:数据结构2.就排序算法所用的辅助空间而言,堆排序、快速排序、归并排序的关系是( )。

A.堆排序<快速排序<归并排序B.堆排序<归并排序<快速排序C.堆排序>归并排序>快速排序D.堆排序>快速排序>归并排序正确答案:A解析:此题考查的知识点为排序的空间复杂性。

堆排序辅助空间为O(1),快速排序为O(log2n),归并排序为O(n)。

应选A。

知识模块:数据结构3.一组记录的关键码为(25,48,16,35,79,82,23,40,36,72),其中,含有5个长度为2的有序表,按归并排序的方法对该序列进行一趟归并后的结果为( )。

A.16,25,35,48,23,40,79,82,36,72B.16,25,35,48,79,82,23,36,40,72C.16,25,48,35,79,82,23,36,40,72D.16,25,35,48,79,23,36,40,72,82正确答案:A解析:对于(25,48,16,35,79,82,23,40,36,72),(25,48)和(16,35)归并的结果为(16,25,35,48)。

(79,82)和(23,40)归并后的结果为(23,40,79,82),余下的两个记录不归并,所以一趟归并后的结果为(16,25,35,48,23,40,79,82,36,72),本题答案为A。

数据结构上机题

数据结构上机题

数据结构上机题〃1、设有两个有序序列,利用归并排序将它们排成有序表,并输出。

#i nclude"stdio.h"#i nclude"stdlib.h"#defi ne LIST_INIT_SIZE 100#defi ne LISTINCREMENT 10#defi ne OVERFLOW -2#defi ne OK 1typedef struct{ int *elem;int len gth;int listsize;}SqList;int In itList_Sq(SqList &L){L.elem=(i nt *)malloc(LIST_INIT_SIZE*sizeof(i nt)); if(!L.elem)exit(OVERFLOW);L.le ngth=O;L.listsize=LIST_INIT_SIZE;return OK;}void MergeList_Sq(SqList La,SqList Lb,SqList &Lc){int *pa,*pa_last,*pb,*pb_last,*pc;pa=La.elem;pa_last=La.elem+La.le ngth-1;pb=Lb.elem;pb_last=Lb.elem+Lb .len gth-1;Lc」i stsize=Lc .len gth=La .len gth+Lb .len gth;pc=Lc.elem=(i nt*)malloc(Lc.listsize*sizeof(i nt)); if(!Lc.elem)exit(OVERFLOW); while(pa<=pa_last&&pb<=pb_last){if(*pa<=*pb)*pc++=*pa++;else *pc++=*pb++;}while(pa<=pa_last)*pc++=*pa++;while(pb<=pb_last)*pc++=*pb++;}int In put(SqList &L){ int i,j;int *pa=L.elem;printf("要输入的元素个数:”);scan f("%d",&i);printf("输入有序序列:");{ scan f("%d",pa++);L.len gth=i;}prin tf("\n");return OK;}int Output(SqList &L){ printf("输出序列:");int i=0;while(i<L.le ngth)pri ntf("%d ", L.elem[i++]);prin tf("\n");return OK;}int mai n(){SqList La,Lb,Lc;In itList_Sq(La);In itList_Sq(Lb);In itList_Sq(Lc);In put(La);In put(Lb);MergeList_Sq(La,Lb,Lc);Output(Lc);return OK;}〃2、设有一有序序列,从键盘输入一个数,判别是否在序列中,如果在输出"YSE";否则, 将它插入到序列中使它仍然有序,并输出排序后的序列。

数据结构上机考试题目

数据结构上机考试题目

选择题在数据结构中,栈(Stack)是一种什么类型的数据结构?A. 线性B. 树形C. 图形D. 非线性但非树形答案:A在二叉树中,每个节点最多有几个子节点?A. 1B. 2C. 3D. 取决于树的层次答案:B以下哪项是哈希表(Hash Table)的主要优点?A. 存储密度大B. 插入和删除元素快C. 支持随机存取D. 存储空间利用率高答案:B哪种数据结构适用于需要频繁插入和删除操作的场景?A. 数组B. 链表C. 栈D. 队列答案:B在图的表示中,什么用于表示节点之间的关系?A. 节点B. 边C. 顶点D. 权重答案:B以下哪种排序算法的时间复杂度是O(n log n)?A. 冒泡排序B. 选择排序C. 插入排序D. 快速排序答案:D填空题在数据结构中,________是一种特殊的线性数据结构,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。

答案:队列(Queue)在树形结构中,除了根节点外,每个节点都有________个父节点。

答案:一________是一种基于比较的排序算法,通过不断将待排序的序列分割成独立的子序列,并对子序列进行排序,最后将有序子序列合并得到完全有序的序列。

答案:归并排序(Merge Sort)在图的遍历中,________遍历是一种深度优先的遍历算法,它沿着树的深度遍历树的节点,尽可能深地搜索树的分支。

答案:深度优先(Depth-First Search)哈希表是通过________函数将关键字映射到表中的位置来存储数据的。

答案:哈希(Hash)在链表中,________用于指向链表中的下一个节点。

答案:指针(Pointer)简答题简述数据结构的定义及其重要性。

答案:数据结构是计算机存储、组织数据的方式。

它指相互之间存在一种或多种特定关系的数据元素的集合。

数据结构的重要性体现在它是计算机程序设计中不可或缺的一部分,它直接影响到程序的运行效率、数据存储的合理性以及数据操作的便捷性。

数据结构上机考试(含答案)

数据结构上机考试(含答案)

数据结构》上机练习题1、设有两个有序序列, 利用归并排序将它们排成有序表,并输出。

2、设有一有序序列, 从键盘输入一个数, 判别是否在序列中,如果在输出“YSE”;否则, 将它插入到序列中使它仍然有序, 并输出排序后的序列。

3、设有一有序序列,从键盘输入一个数,判别是否在序列中,如果不在,则输出“NO”,否则,将它从序列中删除它, 并输出删除后的序列。

4、从键盘输入一组任意数据,建立一个有序链表, 并从链头开始输出该链,使输出结果是有序的。

5、从键盘输入一组任意数据,建立一个包含所有输入数据的单向循环链表, 并从链表的任意开始, 依次输出该链表中的所有结点。

10、设有一个链表,(自己建立, 数据从键盘输入), 再从键盘输入一个数,判别是否在链表中, 如果不在, 则输出“ NO“,否则, 将它从链表中删除, 并输出删除后的链表。

11、设有一个链表,(自己建立, 数据从键盘输入), 再从键盘输入一个数,判别是否在链表中,如果在输出“ YSE”,否则,将它从插入到链头,并输出插入后的链表。

12、设有一个链表,(自己建立, 数据从键盘输入), 再从键盘输入一个数,判别是否在链表中,如果在输出“ YSE”,否则,将它从插入到链尾,并输出插入后的链表。

13、编写栈的压栈push、弹栈pop函数, 从键盘输入一组数据,逐个元素压入堆栈, 然后再逐个从栈中弹出它们并输出14、编写栈的压栈 push 、弹栈 pop 函数,用它判别() 的匹配问题 树中序遍历的结果。

树先序遍历的结果。

树后序遍历的结果。

树的总结点数。

树叶子结点数。

叉树的高度。

21、给出一个无向图的邻接矩阵 , 输出各个顶点的度。

22、给出一个有向图的邻接矩阵 , 输出各个顶点的入度与出度。

23、输入一个有序序列 , 利用折半查找来查找一个数是否在序列中 出其位置 ,否则输出“ NO ”。

24、用插入排序方法对一组数据进行排序 , 并输出每趟排序的结果。

数据结构 排序 历年考研练习题库 试卷及答案

数据结构 排序 历年考研练习题库 试卷及答案

数据结构排序历年考研练习题库试卷及答案数据结构排序历年考研练习题库试卷及答案一、冒泡排序冒泡排序是一种基本的排序算法,它通过重复地交换相邻两个元素的位置来实现排序。

算法的基本思想是从待排序的元素中比较相邻的两个元素大小,并根据需要交换它们的位置,直到整个序列有序为止。

冒泡排序的原理如下:首先从序列的第一个元素开始,比较相邻的两个元素的大小,若前面的元素大于后面的元素,则交换它们的位置;否则,继续比较下一对相邻元素,直到比较到序列的最后一个元素。

这样一趟比较下来,序列中最大的元素就会被交换到最后一个位置。

接着,对序列中剩下的 n-1 个元素重复上述过程,执行 n-1 趟比较,直到整个序列有序。

在实践中,冒泡排序的时间复杂度为 O(n^2),其中 n 为待排序序列的长度。

尽管冒泡排序存在其它更好的排序算法,但它具有编码简单、实现容易以及对小规模数据排序的优势。

二、选择排序选择排序也是一种简单直观的排序算法,它的思想是将待排序序列分为已排好序的部分和未排序的部分,每次选取未排序部分中最小(或最大)的元素,将其放置在已排好序的部分的末尾。

重复此过程,直到整个序列有序。

选择排序的具体步骤如下:首先从待排序序列中找到最小(或最大)的元素,然后将其与序列的第一个元素交换位置,将该元素视为已排序部分;接着,在剩下的未排序部分中找到最小(或最大)的元素,将其与第二个元素交换位置,将该元素视为已排序部分的最后一个元素;以此类推,每次选择序列中最小(或最大)的元素,并将该元素放置在已排序部分的末尾。

最终完成排序。

选择排序的时间复杂度同样为 O(n^2),其中 n 为待排序序列的长度。

相比于冒泡排序,选择排序的交换操作较少,因此在实际应用中,选择排序的性能要优于冒泡排序。

三、插入排序插入排序是一种简单直观的排序算法,它的基本思想是将待排序的元素逐个插入已排好序的部分中,直到整个序列有序。

与冒泡排序和选择排序不同,插入排序是一种原地排序算法。

数据结构算法练习题

数据结构算法练习题

1.(13年自主命题真题)归并排序中一般采用2-路归并,即在两个有序子序列中挑选关键字最小的元素。

如果采用k-路(k>2)归并,即每次在k个有序子序列中挑选最小元素,这样能够提高排序效率吗?为什么?(提示:这样不能提高排序效率)不能提高排序效率。

在k个元素中逐次挑选最小元素,若采用顺序查找方式,其时间代价为O(k),因此,整个排序过程的时间复杂度为:T=O(n)×O(k)×log k n = O(n×klog k n)而:log k n = log2n / log2k所以,有:T=O(n)×O(k)×log k n = O(n×klog k n)= O(n×log2n×(k/log2k))而k/log2k是k的递增函数,因此,降低了排序效率。

若以折半查找方式选择最小元素,则每选择一个最小元素后,需要对所有有序子序列的最小元素重新进行一次排序操作,不难看出,整个排序过程的时间复杂度不好于O(n×(log2k+k)×log k n)。

若以堆(或竞赛树)的形式组织数据,则每选择一个最小元素的时间代价为log2k,整个排序过程的时间复杂度是:T=O(n×log2k×log k n)而:log k n = log2n / log2k所以:T=O(n×log2n)因此,也不能提高排序效率,且需要占用较多的辅助空间。

2.采用逆序顺序输出单链表:假设有不带头结点的单链表List,其中每个结点包含了一个字符型数据。

请编写算法,逆序输出单链表List中所有结点的数据。

(提示:采用递归方法)[算法设计思想]采用递归的思想设计算法,即先递归输出除第一个结点外的其他结点,然后再输出第一个结点。

3.判断出栈序列是否合法:假设1, 2, …, n为入栈序列S,序列T 为S中所有元素的一个排列(任意一个),请编写算法,判定T是否为对应于S的一个合法的出栈序列(提示:栈的使用)。

归并题目例子

归并题目例子

归并题目例子归并排序是一种分治的思想,将大问题拆解成为小问题,将一个大的数组先拆分成几个小的数组,然后再一点点的合并。

举例说明:比如我们准备排序的数组是:9,5,8,4,7,3,6,2这8个数首先,我们的算法会将整个的数组拆分。

拆分步骤如下:到这里,整个数组已经无法继续拆分了。

这里必须要说明的是,整个的算法是使用递归的方式一步步往下进行的。

所以,走到第三步,已经是这个递归的尾部了。

于是,我们就需要回溯到上一步,开始对数组进行整合排序。

实际上,你可以理解为,“返回上一步,并对其中的每一个小数组进行排序”。

回溯的步骤如下:到这里,整个归并排序就结束了。

看完了概念,很多同学肯定还是一脸懵,没看明白。

不过没关系,下面我们使用代码,来着重讲解一下每一个步骤的具体实现。

(1)首先,我们要将一个大的数组,拆分成为若干个小的数组,这里的“拆分”,是使用递归的方式来实现的。

(2)我们的归并排序函数,有两个参数。

我们根据这两个索引,就可以求出它的中间索引(在左右索引中间的部分),进而将这个数组分为两半。

例如,让我们回到9 5 8 4 7 3 6 2这个数组。

我们对它的第二部分(右半部分)的7 3 6 2进行拆分。

站在我们“人类”的视角,能轻松得到拆分成两个部分的结果,也就是“7 3”和“6 2”。

这属于人类的幼儿园水平。

但问题在于,我们怎样使用代码来实现这个操作呢?这就要用到先前提到的“左索引”和“右索引”两个参数了。

首先我们拿到的7 3 6 2这个数组,它在原数组中的左索引值为4,右索引值为7。

接下来,我们只需要拿到中间索引即可。

这个其实很容易,用左边的值加上右边的值除以2就可以得到。

但是,需要注意的是,有些编程语言在做除法时,会将结果强制转换为小数。

比如说得到的值为2,但是结果显示和储存的是2.0,这样就不利于我们进行后续的计算和处理了。

我们就必须要做一下调整。

所以。

我们直接对2取整,就可以避免这个问题的出现。

数据结构 上机练习题

数据结构 上机练习题

线性表1、某软件公司大约有30名员工,每名员工有姓名、工号、职务等属性,每年都有员工离职和入职。

把所有员工按照顺序存储结构建立一个线性表,建立离职和入职函数,当有员工离职或入职时,修改线性表,并且打印最新的员工名单。

2、约瑟夫(Josephus)环问题:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。

一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止。

报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,直到所有人全部出列为止。

建立n个人的单循环链表存储结构,运行结束后,输出依次出队的人的序号。

栈和队列3、某商场有一个100个车位的停车场,当车位未满时,等待的车辆可以进入并计时;当车位已满时,必须有车辆离开,等待的车辆才能进入;当车辆离开时计算停留的的时间,并且按照每小时1元收费。

汽车的输入信息格式可以是(进入/离开,车牌号,进入/离开时间),要求可以随时显示停车场内的车辆信息以及收费历史记录。

4、某银行营业厅共有6个营业窗口,设有排队系统广播叫号,该银行的业务分为公积金、银行卡、理财卡等三种。

公积金业务指定1号窗口,银行卡业务指定2、3、4号窗口,理财卡业务指定5、6号窗口。

但如果5、6号窗口全忙,而2、3、4号窗口有空闲时,理财卡业务也可以在空闲的2、3、4号窗口之一办理。

客户领号、业务完成可以作为输入信息,要求可以随时显示6个营业窗口的状态。

5、4阶斐波那契序列如下:f0=f1=f2=0, f3=1,…,f i=f i-1+f i-2+f i-3+f i-4,利用容量为k=4的循环队列,构造序列的前n+1项(f0, f1 , f2 ,… fn ),要求满足f n≤200而f n+1 >200。

6、八皇后问题:设8皇后问题的解为(x1, x2, x3, …,x8), 约束条件为:在8x8的棋盘上,其中任意两个xi 和xj不能位于棋盘的同行、同列及同对角线。

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

实验一归并排序
一、实验目的
(1)掌握归并排序算法的思想;
(2)掌握归并排序算法的程序实现。

二、实验环境
Windows 2000以上版本的操作系统,运用java或C语言实现该算法。

三、实验内容
在main函数中定义数A[]={52,49,80,36,14,58,61,23,97},调用归并排序函数MergeSort对A[]中的数据进行排序,调试并观察排序过程。

C语言实现:
1.#include<stdlib.h>
2.typedef int RecType;//要排序元素类型
3.void Merge(RecType *R,int low,int m,int high)
4.{
5.//将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的子文件
R[low..high]
6.int i=low,j=m+1,p=0; //置初始值
7. RecType *R1; //R1是局部向量
8. R1=(RecType *)malloc((high-low+1)*sizeof(RecType));
9.if(!R1)
10. {
11.return; //申请空间失败
12. }
13.while(i<=m&&j<=high) //两子文件非空时取其小者输出到R1[p]上
14. {
15. R1[p++]=(R[i]<=R[j])?R[i++]:R[j++];
16. }
17.while(i<=m) //若第1个子文件非空,则复制剩余记录到R1中
18. {
19. R1[p++]=R[i++];
20. }
21.while(j<=high) //若第2个子文件非空,则复制剩余记录到R1中
22. {
23. R1[p++]=R[j++];
24. }
25.for(p=0,i=low;i<=high;p++,i++)
26. {
27. R[i]=R1[p]; //归并完成后将结果复制回R[low..high]
28. }
29.}
30.void MergeSort(RecType R[],int low,int high)
31.{
32.//用分治法对R[low..high]进行二路归并排序
33.int mid;
34.if(low<high)
35. { //区间长度大于1
36. mid=(low+high)/2; //分解
37. MergeSort(R,low,mid); //递归地对R[low..mid]排序
38. MergeSort(R,mid+1,high); //递归地对R[mid+1..high]排序
39. Merge(R,low,mid,high); //组合,将两个有序区归并为一个有序区
40. }
41.}
42.void main()
43.{
44.int a[9]={52,49,80,36,14,58,61,23,97}; //这里对9个元素进行排序
45.int low=0,high=8; //初始化low和high的值
46.
47. printf("Before merge sort: ");
48.for(int i=low;i<=high;i++)
49. {
50. printf("%d ",a[i]); //输出测试
51. }
52. printf("/n");
53.
54. MergeSort(a,low,high);
55.
56. printf("After merge sort: ");
57.for( i=low;i<=high;i++)
58. {
59. printf("%d ",a[i]); //输出测试
60. }
61. printf("/n");
62.}
java实现:
public class MergeSort {
/**
* 归并排序先将初始的序列表看成是n个长度为1的有序表(1)定义指针i,指向第一个序列表的第一个元素
* (2)定义指针j,指向第二个序列表的第一个元素
* (3)比较i,j指向的元素大小,若前者大,将后者插入到新表中,否则把前者插入到后表中* (4)直到取完第一个序列表或者第二个序列表为止
*/
public static void main(String[] args) {
int[] num = {52,49,80,36,14,58,61,23,97 };
int[] num1 = new int[9];
num = mergesort(num, 0, num.length - 1, num1);
for (int i : num) {
System.out.print(i + " ");
}
}
private static int[] mergesort(int[] num, int s, int t, int[] num1) {
int m;
int[] num2 = new int[t + 1];
if (s == t)
num1[s] = num[s];
else {
m = (s + t) / 2;
mergesort(num, s, m, num2);//左半部分递归调用
mergesort(num, m + 1, t, num2);//右半部分递归调用
merg(num2, s, m, t, num1);// 由num2去归并,返回的值放到num1中,num1赋新值,//其实就是更新num2,然后让num2再去归并,返回新的num1
}
return num1;
}
//有序表的合并
private static void merg(int[] num, int l, int m, int n, int[] num1) {
System.out.print("l=" + l + " m=" + m + " n=" + n);
System.out.println();
int i, j, k;
i = l;
j = m + 1;
k = l;
while (i <= m && j <= n) {
if (num[i] < num[j])
num1[k++] = num[i++];
else {
num1[k++] = num[j++];
}
}
while (i <= m) {
num1[k++] = num[i++];
}
while (j <= n) {
num1[k++] = num[j++];
}
}
}。

相关文档
最新文档