-
二分归并排序
2020-05-18 20:38:19设待排序表有10个记录,其关键字分别为{18,2,20,34,12,32,6,16,1,5}。 采用二分归并排序方法排序过程: 3、设计 void MergeSort(RecType R[],int n) { int length; for(length=1;length<n1、问题
对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k
思路:
归并排序是多次将相邻两个或两个以上的有序表合并成一个新的有序表。
最简单的归并是将两个有序的子表合并成一个有序的表,即二分归并排序。2、解析
设待排序表有10个记录,其关键字分别为{18,2,20,34,12,32,6,16,1,5}。
采用二分归并排序方法排序过程:
3、设计
void MergeSort(RecType R[],int n) { int length; for(length=1;length<n;length=length*2){ MergePass(R,length,n); } }
void Merge(RecType R[],int low,int mid,int high){ RecType *R1; int i=low,j=mid+1,k=0; R1=(RecType *)malloc((high-low+1)*sizeof(RecType)); while(i<=mid&&j<=high){ if(R[i].key<=R[j].key){ R1[k]=R[i]; i++; k++; } else{ R1[k]=R[j]; j++; k++; } } while(i<=mid){ R1[k]=R[i]; i++; k++; } while(j<=high){ R1[k]=R[j]; j++; k++; } for(k=0,i=low;i<=high;i++,k++){ R[i]=R1[k]; } } void MergePass(RecType R[],int length,int n){ //一趟二路归并 int i; for(i=0;i+2*length-1<n;i=i+2*length){ //归并length长的两相邻子表 Merge(R,i,i+length-1,i+2*length-1); } if(i+length-1<n){ //余下两个子表,后者长度小于length Merge(R,i,i+length-1,n-1);//归并两个子表 } }
4、分析
每一趟归并的时间复杂度为O(n)。
总共需进行[log2 n]趟。
二分归并排序的时间复杂度为O(nlog2 n)。 -
排序 2021-1-20
2021-01-20 21:41:21对N个记录进行归并排序,归并趟数的数量级是O(NlogN)。 F 1-3 对N个记录进行堆排序,需要的额外空间为O(N)。 F 1-4 对N个记录进行简单选择排序,比较次数和移动次数分别为O(N^2 )和O(N)。 T 1-5 对N个...1-1
仅基于比较的算法能得到的最好的“最坏时间复杂度”是O(NlogN)。T
1-2
对N个记录进行归并排序,归并趟数的数量级是O(NlogN)。F
1-3
对N个记录进行堆排序,需要的额外空间为O(N)。F
1-4
对N个记录进行简单选择排序,比较次数和移动次数分别为O(N^2 )和O(N)。T
1-5
对N个记录进行快速排序,在最坏的情况下,其时间复杂度是O(NlogN)。F
1-6
希尔排序是稳定的算法。F
1-7
对N个不同的数据采用冒泡排序进行从大到小的排序,当元素基本有序时交换元素次数肯定最多。F
1-8
要从50个键值中找出最大的3个值,选择排序比堆排序快。T
1-9
用3条磁带对55个有序段做2路归并,初始的段分配成(34,21)比分配成(30,25)要好。T
1-10
采用递归方式对顺序表进行快速排序,每次划分后,先处理较短的分区可以减少递归次数。T
2-1
在对N个元素进行排序时,基于比较的算法中,其“最坏时间复杂度”中最好的是:
A.O(logN)
B.O(N)
C.O(NlogN)
D.O(N^2 )C
2-2
下列排序算法中,哪种算法可能出现:在最后一趟开始之前,所有的元素都不在其最终的位置上?(设待排元素个数N>2)A.冒泡排序
B.插入排序
C.堆排序
D.快速排序B
2-3
对一组数据{ 2,12,16,88,5,10 }进行排序,若前三趟排序结果如下: 第一趟排序结果:2,12,16,5,10,88 第二趟排序结果:2,12,5,10,16,88 第三趟排序结果:2,5,10,12,16,88 则采用的排序方法可能是:A.冒泡排序
B.希尔排序
C.归并排序
D.基数排序A
2-4
下面四种排序算法中,稳定的算法是:A.堆排序
B.希尔排序
C.归并排序
D.快速排序C
2-5
对N个不同的数据采用冒泡算法进行从大到小的排序,下面哪种情况下肯定交换元素次数最多?A.从小到大排好的
B.从大到小排好的
C.元素无序
D.元素基本有序A
2-6
有组记录的排序码为{ 46,79,56,38,40,84 },则利用堆排序的方法建立的初始堆为:A.79,46,56,38,40,80
B.84,79,56,46,40,38
C.84,56,79,40,46,38
D.84,79,56,38,40,46D
2-7
有组记录的排序码为{46,79,56,38,40,84 },采用快速排序(以位于最左位置的对象为基准而)得到的第一次划分结果为:A.{38,46,79,56,40,84}
B.{38,79,56,46,40,84}
C.{38,46,56,79,40,84}
D.{40,38,46,56,79,84}D
2-8
给定初始待排序列{ 15,9,7,8,20,-1,4 }。如果希尔排序第一趟结束后得到序列为{ 15,-1,4,8,20,9,7 },则该趟增量为:A.1
B.2
C.3
D.4D
2-9
对N个元素采用简单选择排序,比较次数和移动次数分别为:A.O(N^2 ), O(N)
B.O(N), O(logN)
C.O(logN), O(N^2 )
D.O(NlogN), O(NlogN)A
2-10
对N个记录进行堆排序,最坏的情况下时间复杂度是:A.O(logN)
B.O(N)
C.O(NlogN)
D.O(N^2 )C
2-11
在基于比较的排序算法中,哪种算法的最坏情况下的时间复杂度不高于O(NlogN)?A.冒泡排序
B.归并排序
C.希尔排序
D.快速排序B
2-12
对大部分元素已有序的数组进行排序时,直接插入排序比简单选择排序效率更高,其原因是:(I). 直接插入排序过程中元素之间的比较次数更少
(II). 直接插入排序过程中所需要的辅助空间更少
(III). 直接插入排序过程中元素的移动次数更少A.仅 I
B.仅 III
C.仅 I、II
D.I、II 和 IIIA
2-13
若数据元素序列{ 11,12,13,7,8,9,23,4,5 }是采用下列排序方法之一得到的第二趟排序后的结果,则该排序算法只能是:A.冒泡排序
B.选择排序
C.插入排序
D.归并排序C
2-14
就排序算法所用的辅助空间而言,堆排序、快速排序、归并排序的关系是:A.堆排序 < 归并排序 < 快速排序
B.堆排序 > 归并排序 > 快速排序
C.堆排序 < 快速排序 < 归并排序
D.堆排序 > 快速排序 > 归并排序作者
C
2-15
对于7个数进行冒泡排序,需要进行的比较次数为:A.7
B.14
C.21
D.49C
2-16
对N个记录进行归并排序,空间复杂度为:A.O(logN)
B.O(N)
C.O(NlogN)
D.O(N^2)B
2-17
下列排序算法中,时间复杂度不受数据初始状态影响,恒为O(NlogN)的是:A.冒泡排序
B.直接选择排序
C.堆排序
D.快速排序C
2-18
排序方法中,从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置的方法称为:A.插入排序
B.选择排序
C.快速排序
D.归并排序A
2-19
对一组包含10个元素的非递减有序序列,采用直接插入排序排成非递增序列,其可能的比较次数和移动次数分别是:A.100, 100
B.100, 54
C.54, 63
D.45, 44D
2-20
对N个记录进行快速排序,在最坏的情况下,其时间复杂度是:A.O(N)
B.O(NlogN)
C.O(N^2 )
D.O(N^2 logN)C
2-21
对N个记录进行堆排序,需要的额外空间为:A.O(1)
B.O(logN)
C.O(N)
D.O(NlogN)A
2-22
给出关键字序列{ 431, 56, 57, 46, 28, 7, 331, 33, 24, 63 },下面哪个选择是按次位优先(LSD)链式基数排序进行了一趟分配和收集的结果?A.→331→431→33→63→24→56→46→57→7→28
B.→56→28→431→331→33→24→46→57→63→7
C.→431→331→33→63→24→56→46→57→7→28
D.→57→46→28→7→33→24→63→56→431→331C
2-23
将序列{ 2, 12, 16, 88, 5, 10, 34 }排序。若前2趟排序的结果如下:第1趟排序后:2, 12, 16, 10, 5, 34, 88
第2趟排序后:2, 5, 10, 12, 16, 34, 88
则可能的排序算法是:A.冒泡排序
B.归并排序
C.快速排序
D.插入排序C
2-24
数据序列{ 3, 1, 4, 11, 9, 16, 7, 28 }只能是下列哪种排序算法的两趟排序结果?A.冒泡排序
B.快速排序
C.插入排序
D.堆排序B
2-25
设有1000个元素的有序序列,如果用二分插入排序再插入一个元素,则最大比较次数是:A.1000
B.999
C.500
D.10D
-
设一组初始记录关键字序列为(25,50,15,35,80,85,20,40,36,70)进行一趟归并后的结果为
2018-09-23 15:19:57 -
堆排序
2016-09-03 11:44:52堆排序是利用堆的特性对记录序列进行排序的一种排序方法。 即小顶堆:父结点的值小于左右孩子结点的值,大顶堆的相反 假设我们要排序的序列是{50,10,90,30,70,40,80,60,20} 堆排序分为两个步骤: 1.构造大顶堆...堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。
堆排序是利用堆的特性对记录序列进行排序的一种排序方法。
即小顶堆:父结点的值小于左右孩子结点的值,大顶堆的相反
假设我们要排序的序列是{50,10,90,30,70,40,80,60,20}
堆排序分为两个步骤:
1.构造大顶堆(或者小顶堆)
如图所示:将输入的数组不断调整,使得其构成大顶堆
void HeapAjust(int* arr,int start,int end) { int temp,j; temp = arr[start]; for (j = 2*s;j <= end;j*=2) { if(j < m && arr[j] < arr[j+1])//左孩子小于右孩子 j++; if(temp >= arr[j]) break; arr[start] = arr[j]; start = j; } arr[start] = temp; }
在这里我们使用大顶堆,依次输出元素如下图:
依次类推输出所有元素
程序如下:
void HeapSort(int* arr,int len) { int i; for(i = len/2;i>= 0;i--)//构造大顶堆 HeapAjust(arr,i,len-1); for (i = len-1;i > 0;i--) { swap(arr[0],arr[i]);//取堆顶的记录和当前未经排序子序列的最后一个记录交换 HeapAjust(arr,1,i-1); } }
这里给出完整代码(仅供参考):
#include <stdio.h> #include <stdlib.h> void swap(int& data1,int &data2) { int temp = data1; data1 = data2; data2 = temp; } //返回i的父结点 int parent(int i) { return (i-1)/2; } //返回i的左孩子结点 int leftchild(int i) { return 2*i+1; } //返回i的右孩子结点 int rightchild(int i) { return 2*i+2; } void MaxHeapify(int *arr,int len,int i) { int lchild = leftchild(i); int rchild = rightchild(i); int nmax; if(lchild < len && arr[lchild] > arr[i]) nmax = lchild; else nmax = i; if(rchild < len && arr[rchild] > arr[nmax]) nmax = rchild; if (nmax != i) { swap(arr[nmax],arr[i]); MaxHeapify(arr,len,nmax); } } //堆排序 void HeapSort(int* arr,int len) { for (int i = parent(len - 1);i >= 0;i--) MaxHeapify(arr,len,i); for (int j = len -1;j > 0;j--) { swap(arr[j],arr[0]); len--; MaxHeapify(arr,len,0); } } void print(int* arr,int len) { int i =0; while (i < len) printf("%d ",arr[i++]); // for (int i = 0;i < len;i++) // { // printf("%d ",arr[i]); // } } int main() { int nArr[10] = {4,1,3,2,16,9,10,14,8,7}; printf("排序前:"); print(nArr, 10); HeapSort(nArr, 10); printf("\n排序后:"); print(nArr, 10); system("pause"); return 0; }
复杂度分析:
运行时间主要是消耗在初始建堆和重建堆时的反复筛选上,在构建堆的过程中,因为是完全二叉树最下层最右边的非终端结点开始构建,将它与其孩子比较若有必要进行交换,对于每个非终端结点来说,其实最多进行两次比较和呼唤操作,因此整个构建过程的时间复杂度为O(n),在排序时,第i次取堆顶记录重建时需要使用O(logi)的时间,并需要取 n-1 次堆顶记录,因此重建堆时的时间复杂度为 O(nlogn).因此总体来说堆排序的时间复杂度为 O(nlogn)。由于堆排序对原始记录的排序状态并不敏感,因此他无论是最好、最坏和平均时间复杂度均为 O(nlogn)。这在性能是要超过 冒泡排序、简单选择排序、直接插入排序的 O(n^2) 的时间复杂度。空间复杂度上,他只有一个用来交换的暂存单元,也非常不错。但是由于记录的比较与交换是跳跃式进行,因此堆排序是一种不稳定的排序方法。
-
第十章 排序作业及答案数据结构
2019-08-23 15:17:26对n个元素进行归并排序,空间复杂度为 。 综合题(共24分)。 1. (共12分)有一组待排序的关键字如下: (54,38,96,23,15,72,60,45,83) 分别写出希尔排序(d=5)、快速排序、堆排序、归并排序第一趟升序排序... -
[四川农业大学]《数据结构(专科)》20年6月作业考核.doc
2020-05-08 23:45:10[四川农业大学]数据结构专科20年6月作业考核 试卷总分:100 得分:100 第1题,一组记录的关键字经一趟二路归并排序后得到含有5个长度为2的有序表如下25481635798223403672在此基础上按二路归并排序方法再对该序列进行一... -
大话数据结构三个版本
2018-09-10 09:39:38最新版 最新版 最新版 高清 高清 高清 包含三个版本 三个版本!!! 本书为超级畅销书《大话设计模式》作者程杰潜心三年推出的扛鼎之作!以一个计算机教师教学为场景,讲解数据结构和相关算法的知识。通篇以一种... -
第15周项目2
2017-12-20 22:36:29在同一数据集上,用直接插入排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序等算法进行排序, 记录所需要的时间,经过对比,得到对复杂度不同的各种算法在运行时间方面的感性认 -
做了一个小时的面试题(没有过 希望大家帮忙答下 虽然很幼稚 毕竟每个人都是这么过来的吗 感激了!...
2010-04-16 11:10:58归并排序,分配排序(箱排序、基数排序) 快速排序的伪代码。 //使用快速排序方法对a[ 0 :n- 1 ]排序 从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点 把余下的元素分割为两段left 和r i g h t... -
但是需要注意的是,在常规归并排序的时候,如果前一个元素大于后一个元素,直接进行交换即可,只进行了一次操作,但是对于这道题来讲,对于每一次的归并段,我们选择从后向前遍历,前面的归并段的某一个数值left[i]...
-
《大话数据结构》( 程杰 编著)
2018-02-15 10:00:21简单的说,就是把我们要压缩的文本进行重新编码,以达到减少不必要的空间的技术。压缩和解压缩技术就是基于赫夫曼的研究之上发展而来,我们应该记住他。 6.12.1赫夫曼树 200 6.12.2赫夫曼树定义与原理 203 6.12.3... -
大话数据结构
2019-01-10 16:35:22简单的说,就是把我们要压缩的文本进行重新编码,以达到减少不必要的空间的技术。压缩和解压缩技术就是基于赫夫曼的研究之上发展而来,我们应该记住他。 6.12.1赫夫曼树 200 6.12.2赫夫曼树定义与原理 203 6.12.3... -
大话数据结构 程杰
2018-09-01 10:06:43简单的说,就是把我们要压缩的文本进行重新编码,以达到减少不必要的空间的技术。压缩和解压缩技术就是基于赫夫曼的研究之上发展而来,我们应该记住他。 6.12.1赫夫曼树 200 6.12.2赫夫曼树定义与原理 203 6.12.3... -
大话数据结构(中文高清版)
2017-04-19 11:57:092.3 两种算法的比较 19 高斯在上小学的一天,老师要求每个学生都计算1+2+…+100的结果,谁先算出来谁先回家…… 2.4 算法定义 20 现实世界中的算法千变万化,没有通用算法可以解决所有问题。甚至一个小问题,某个... -
大话数据结构-程杰
2014-07-13 23:45:52简单的说,就是把我们要压缩的文本进行重新编码,以达到减少不必要的空间的技术。压缩和解压缩技术就是基于赫夫曼的研究之上发展而来,我们应该记住他。 6.12.1 赫夫曼树 200 6.12.2 赫夫曼树定义与原理 203 ... -
数据结构课设
2013-01-03 02:51:25之一为倒序),每个样本有20000随机整数,利用直接插入排序、希尔排序,冒泡排序、快速排序、选择排序、堆排序,归并排序(递归和非递归),基数排序八种排序方法进行排序(结果为由小到大的顺序),并统计每一种... -
数据结构题
2012-12-27 16:58:40归并排序 D.基数排序 13.不可能生成右图所示二叉排序树的关键字序列是( ) A.4 5 3 1 2 B.4 2 5 3 1 C.4 5 2 1 3 D.4 2 3 1 5 14.平衡二叉树中任一结点的( ) A.左、右子树的高度均相同 B.左、右子树高度差的... -
超级有影响力霸气的Java面试题大全文档
2012-07-18 09:47:04Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 13、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 14、... -
数据结构演示软件
2013-06-02 21:32:36(1)多路平衡归并排序(K-Merge) (2)置换-选择排序(Repl_Selection) 三、 运行环境 1. 硬件:Pentium100以上PC机。 2. 软件:Windows95及以上版本的操作系统。 四、 运行 本系统的执行文件为DSDEMOW.EXE... -
用c描述的数据结构演示软件
2012-07-24 13:31:25(1)多路平衡归并排序(K-Merge) (2)置换-选择排序(Repl_Selection) 三、 运行环境 1. 硬件:Pentium100以上PC机。 2. 软件:Windows95及以上版本的操作系统。 四、 运行 本系统的执行文件为DSDEMOW.EXE。 ... -
java 面试题 总结
2009-09-16 08:45:34Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 10、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 11、HashMap... -
c语言经典案例
2014-10-30 08:06:57实例024 归并排序 29 实例025 二分查找 31 实例026 分块查找 32 实例027 哈希查找 34 实例028 斐波那契数列 37 实例029 哥德巴赫猜想 38 实例030 尼科彻斯定理 39 第4章 常用数据类型 41 实例031 数值型常量的使用 ... -
《数据结构 1800题》
2012-12-27 16:52:0317. 在有 n个选手参加的单循环赛中,总共将进行______场比赛。【合肥工业大学 1999三、8(2分)】 四、应用题 1. 数据结构是一门研究什么内容的学科?【燕山大学 1999 二、1 (4分)】 2. 数据元素之间的关系在... -
C程序范例宝典(基础代码详解)
2013-05-17 00:15:35实例133 归并排序 198 4.3 查找算法 199 实例134 顺序查找 199 实例135 二分查找 201 实例136 分块查找 202 实例137 哈希查找 203 4.4 定理与猜想 206 实例138 斐波那契数列 206 实例139 角谷猜想... -
《Java Web开发实战1200例(第I卷)》(清华出版.卢瀚.王春斌).part2 高清完整PDF版
2016-06-13 12:06:47实例045 归并排序法 2.6 算法应用 实例046 算法应用——百钱买百鸡 实例047 算法应用——韩信点兵 实例048 算法应用——斐波那契数列 实例049 算法应用——水仙花数 实例050 算法应用——素数 实例051 算法... -
Visual Basic开发实战1200例(第Ⅰ卷).(清华出版.孙秀梅.巩建华).part1
2016-06-14 11:19:42实例094 归并排序算法 4.4 查找算法 实例095 顺序查找 实例096 二分法查找 实例097 分块查找 实例098 哈希查找 4.5 字符处理应用 实例099 简单的加密解密算法 实例100 字符串处理 4.6 游戏算法 实例101 ... -
C++程序设计语言(特别版)--详细书签版
2012-04-23 07:13:031995年,BYTE杂志颁予他“近20年来计算机工业最具影响力的20人”的称号。 [同作者作品] C++ 程序设计语言(特别版)(英文影印版) C++语言的设计和演化[按需印刷] C++程序设计语言(特别版) 译者: 裘宗燕... -
C++程序设计语言(特别版)--课后习题源代码
2012-04-23 07:37:341995年,BYTE杂志颁予他“近20年来计算机工业最具影响力的20人”的称号。 [同作者作品] C++ 程序设计语言(特别版)(英文影印版) C++语言的设计和演化[按需印刷] C++程序设计语言(特别版) 译者: 裘宗燕... -
C++程序设计语言(特别版)--源代码
2012-04-23 07:33:511995年,BYTE杂志颁予他“近20年来计算机工业最具影响力的20人”的称号。 [同作者作品] C++ 程序设计语言(特别版)(英文影印版) C++语言的设计和演化[按需印刷] C++程序设计语言(特别版) 译者: 裘宗燕...