数据结构练习(答案)

合集下载

数据结构练习(附答案)

数据结构练习(附答案)

习题一绪论.1.1 单项选择题1. 数据结构是一门研究非数值计算的程序设计问题中计算机的① A 以及它们之间的② B 和运算等的学科。

①A.操作对象B.计算方法C.逻辑存储D.数据映象②A.结构B.关系C.运算D.算法2. 数据结构被形式地定义为(K,R),其中K是① B 的有限集合,R是K上的②D 有限集合。

①A.算法B.数据元素C.数据操作D.逻辑结构②A.操作B.映象C.存储D.关系3. 在数据结构中,从逻辑上可以把数据结构分成 C 。

A.动态结构和静态结构B.紧凑结构和非紧凑结构C.线性结构和非线性结构D.内部结构和外部结构4. 线性表的顺序存储结构是一种① A 的存储结构,线性表的链式存储结构是一种② B 的存储结构。

A.随机存取B.顺序存取C.索引存取D.散列存取5. 算法分析的目的是① C ,算法分析的两个主要方面是② A B 。

① A. 找出数据结构的合理性 B. 研究算法中的输入和输出的关系C. 分析算法的效率以求改进D. 分析算法的易懂性和文档性② A. 空间复杂性和时间复杂性 B. 正确性和简明性C. 可读性和文档性D. 数据复杂性和程序复杂性6. 计算机算法指的是① C ,它必具备输入、输出和② B 等五个特性。

①A. 计算方法 B. 排序方法C. 解决问题的有限运算序列D. 调度方法②A. 可行性、可移植性和可扩充性 B. 可行性、确定性和有穷性C. 确定性、有穷性和稳定性D. 易读性、稳定性和安全性7. 线性表的逻辑顺序与存储顺序总是一致的,这种说法 B 。

A. 正确B. 不正确8. 线性表若采用链式存储结构时,要求内存中可用存储单元的地址 D 。

A. 必须是连续的B. 部分地址必须是连续的C. 一定是不连续的D. 连续或不连续都可以9. 在以下的叙述中,正确的是 B 。

A.线性表的线性存储结构优于链表存储结构B.二维数组是其数据元素为线性表的线性表C.栈的操作方式是先进先出D.队列的操作方式和先进后出10. 每种数据结构都具备三个基本运算:插入、删除和查找,这种说法 B 。

数据结构试题集(包含答案-完整版)

数据结构试题集(包含答案-完整版)

数据结构试题集(包含答案-完整版)数据结构试题集(包含答案-完整版)1. 单选题1) 数据结构是一种()。

a) 存储结构b) 算法c) 数据模型d) 网络答案:c) 数据模型解析:数据结构是一种用于组织和存储数据的方式,描述了数据之间的关系以及对数据的操作。

2) 以下哪种数据结构可以通过索引直接访问元素?a) 链表b) 队列c) 栈d) 数组答案:d) 数组解析:数组是一种线性数据结构,可以通过索引直接访问指定位置的元素。

2. 多选题1) 哪些数据结构属于非线性结构?()a) 队列b) 树c) 栈d) 图答案:b) 树d) 图解析:线性结构中的元素存在一对一的关系,非线性结构中的元素存在一对多或多对多的关系,树和图属于非线性结构。

2) 下列哪些操作可以在栈上进行?()a) 入栈b) 出栈c) 查找d) 删除答案:a) 入栈b) 出栈解析:栈是一种后进先出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。

3. 简答题1) 请简要介绍线性表和非线性表。

答案:线性表是数据元素的一个有限序列,元素之间存在一对一的关系。

非线性表是指元素之间存在一对多或多对多的关系,如树和图。

2) 请解释什么是时间复杂度和空间复杂度。

答案:时间复杂度是衡量算法执行效率的度量,表示算法的运行时间随输入规模增长的速度。

空间复杂度是指算法执行过程中所需的存储空间随输入规模增长的速度。

4. 编程题题目:实现一个栈,包含push、pop和getMin三个操作,要求时间复杂度为O(1)。

答案:class MinStack:def __init__(self):self.stack = []self.min_stack = []def push(self, x):self.stack.append(x)if not self.min_stack or x <= self.min_stack[-1]:self.min_stack.append(x)def pop(self):if self.stack.pop() == self.min_stack[-1]:self.min_stack.pop()def getMin(self):return self.min_stack[-1]解析:在栈的基础上,使用一个辅助栈min_stack来记录当前栈中的最小值。

数据结构试题及答案

数据结构试题及答案

数据结构试题及答案一、选择题(每题2分,共20分)1. 在数据结构中,线性结构的特点是元素之间存在一对一的线性关系。

以下哪个数据结构不属于线性结构?A. 栈B. 队列C. 树D. 链表答案:C2. 栈(Stack)是一种后进先出(LIFO)的数据结构,以下哪个操作不是栈的基本操作?A. PushB. PopC. TopD. Sort答案:D3. 在二叉树的遍历中,前序遍历的顺序是:A. 根-左-右B. 左-根-右C. 右-根-左D. 根-右-左答案:A4. 哈希表的冲突可以通过多种方法解决,以下哪个不是解决哈希表冲突的方法?A. 链地址法B. 开放地址法C. 再散列法D. 排序法答案:D5. 以下哪个排序算法是稳定的?A. 快速排序B. 堆排序C. 归并排序D. 选择排序答案:C6. 在图的遍历中,深度优先搜索(DFS)使用的是哪种数据结构来实现?A. 队列B. 栈C. 链表D. 哈希表答案:B7. 以下哪个是图的存储方式?A. 顺序存储B. 链式存储C. 散列表D. 矩阵存储答案:D8. 动态数组(如C++中的vector)在插入元素时可能需要进行的操作是:A. 原地扩展B. 复制元素C. 重新分配内存D. 释放内存答案:C9. 以下哪个不是算法的时间复杂度?A. O(1)B. O(log n)C. O(n^2)D. O(n!)答案:D10. 在查找算法中,二分查找法要求被查找的数据必须是:A. 无序的B. 有序的C. 随机分布的D. 唯一元素答案:B二、简答题(每题5分,共30分)1. 简述链表和数组的区别。

答案:链表和数组都是存储数据的线性数据结构,但它们在内存分配、访问方式、插入和删除操作等方面存在差异。

数组在内存中是连续存储的,可以通过索引快速访问任意元素,但插入和删除元素时可能需要移动大量元素。

链表在内存中是非连续存储的,每个元素包含数据和指向下一个元素的指针,不支持通过索引快速访问,但插入和删除操作只需要改变指针,不需要移动其他元素。

数据结构练习附答案

数据结构练习附答案

一、单项选择题1.逻辑关系是指数据元素间的()A.类型 B.存储方式 C.结构 D.数据项2.对于只在表的首、尾两端进行插入操作的线性表,宜采用的存储结构为( )A.顺序表 B.用头指针表示的单循环链表C. 用尾指针表示的单循环链表D. 单链表3.设数组data[m]作为循环队列SQ的存储空间,front为队头指针,rear为队尾指针,则执行出队操作后其头指针front值为()A.front=front+1 B.front= (front+1)%(m-1)C.front=(front-1)%m D.front=(fro nt+1)%m4.在具有n个单元的顺序存储的循环队列中,假定front和rear分别为队头指针和队尾指针,则判断队满的条件为( )。

A.rear%n==front B.(front+l)%n==rearC.rear%n-1==front D.(rear+l)%n==front5.在具有n个单元的顺序存储的循环队列中,假定front和rear分别为队头指针和队尾指针,则判断队空的条件为( )。

A.rear%n==front B.front+l=rearC.rear==front D.(rear+l)%n=front6.已知一颗二叉树上有92个叶子结点,则它有____个度为2的结点。

( )A. 90B. 91C. 92D. 937.在一棵非空二叉树的中序遍历序列中,根结点的右边_____。

A. 只有右子树上的所有结点B. 只有右子树上的部分结点C. 只有左子树上的所有结点D. 只有左子树上的部分结点8.有n条边的无向图的邻接表存储法中,链表中结点的个数是( )个。

A. nB. 2nC. n/2D. n*n9.判断有向图是否存在回路,除了可利用拓扑排序方法外,还可以利用()。

A. 求关键路径的方法B.求最短路径的方法C. 深度优先遍历算法D.广度优先遍历算法10.对线性表进行二分查找时,要求线性表必须( )。

数据结构题库及答案详解

数据结构题库及答案详解

数据结构题库及答案详解一、选择题1. 在数据结构中,线性结构的特点是什么?A. 结构中存在唯一的开始结点和终端结点B. 结构中所有结点的前驱和后继都存在C. 结构中所有结点都只有一个直接前驱和一个直接后继D. 结构中存在多个开始结点和终端结点答案:C2. 栈是一种特殊的线性表,其特点是:A. 先进先出B. 先进后出C. 可以同时在两端进行插入和删除操作D. 只能在一端进行插入和删除操作答案:D3. 在二叉树的遍历算法中,先序遍历的顺序是:A. 先访问根结点,然后遍历左子树,最后遍历右子树B. 先遍历左子树,然后访问根结点,最后遍历右子树C. 先遍历右子树,然后访问根结点,最后遍历左子树D. 先遍历左右子树,最后访问根结点答案:A二、填空题4. 在图的遍历中,______算法可以避免重复访问同一顶点。

5. 哈希表的冲突可以通过______方法来解决。

答案:4. 深度优先搜索(DFS)5. 链地址法或开放地址法三、简答题6. 简述排序算法中的快速排序算法的基本原理。

答案:快速排序算法是一种分治算法,它通过选择一个元素作为“基准”,然后将数组分为两个子数组,一个包含小于基准的元素,另一个包含大于基准的元素。

然后对这两个子数组递归地应用快速排序算法。

7. 解释什么是递归,并给出一个递归函数的例子。

答案:递归是一种在函数中调用自身的编程技术。

递归函数必须有一个明确的终止条件,以避免无限递归。

例如,计算阶乘的递归函数如下:```int factorial(int n) {if (n == 0) return 1; // 终止条件return n * factorial(n - 1); // 递归调用}```四、编程题8. 编写一个函数,实现单链表的反转。

答案:```c// 假设ListNode是链表节点的定义ListNode* reverseList(ListNode* head) {ListNode* prev = NULL;ListNode* curr = head;ListNode* next = NULL;while (curr != NULL) {next = curr->next; // 保存下一个节点curr->next = prev; // 反转指针prev = curr; // 移动prevcurr = next; // 移动curr}return prev; // 新的头节点}```9. 给定一个整数数组,请实现一个函数来找到数组中的最长连续子序列的长度。

数据结构试题库及答案

数据结构试题库及答案

数据结构试题库及答案一、选择题(每题2分,共20分)1. 在数据结构中,线性表的顺序存储结构通常使用()来存储。

A. 链表B. 栈C. 队列D. 数组答案:D2. 以下哪个算法不是排序算法?A. 快速排序B. 归并排序C. 深度优先搜索D. 堆排序答案:C3. 在二叉树的遍历算法中,先访问根节点,然后遍历左子树,最后遍历右子树的遍历方式是()。

A. 先序遍历B. 中序遍历C. 后序遍历D. 层序遍历答案:A4. 哈希表的冲突解决方法不包括以下哪种?A. 链地址法B. 线性探测法C. 二分查找法D. 再散列法答案:C5. 在图的遍历算法中,广度优先搜索(BFS)使用的辅助数据结构是()。

A. 栈B. 队列C. 堆D. 链表答案:B6. 下列关于堆的描述中,错误的是()。

A. 堆是一种特殊的完全二叉树B. 堆中的每个节点的值都大于其子节点的值C. 堆可以用于实现优先队列D. 堆的插入操作的时间复杂度为O(log n)答案:B7. 在一个长度为n的数组中,使用二分查找算法查找一个元素的最坏情况下的时间复杂度是()。

A. O(1)B. O(n)C. O(n^2)D. O(log n)答案:D8. 以下哪个数据结构不是线性结构?A. 链表B. 栈C. 队列D. 二叉树答案:D9. 以下哪个算法是动态查找表?A. 直接索引B. 顺序查找C. 二分查找D. 哈希表答案:D10. 在图的表示方法中,邻接矩阵表示法的缺点是()。

A. 占用空间大B. 占用空间小C. 插入和删除操作复杂D. 遍历操作复杂答案:A二、填空题(每题2分,共20分)1. 在一个长度为n的数组中,使用顺序查找算法查找一个元素的时间复杂度为________。

答案:O(n)2. 一个具有n个节点的完全二叉树的高度为________。

答案:log2(n) + 1(向上取整)3. 一个长度为n的链表,删除一个节点的时间复杂度为________。

答案:O(1)4. 在图的表示方法中,邻接表表示法的缺点是________。

数据结构练习题及参考答案

数据结构练习题及参考答案

《数据结构》练习题一、解答题(共50分)1、(8分)假设用于通讯的电文字符集及其出现的频率如下表所示。

请为这8个字符设计哈夫曼编码,并画出其哈夫曼树,计算WPL 。

2. (8分)若一棵二叉树中序遍历和后序遍历序列分别为:DBEHGAFIC 和DHGEBIFCA 。

试画出这棵二叉树,并写出其先序遍历和层序遍历序列。

3.(16分)以下无向网络以邻接表为存储结构(假设邻接表的顶点表按字母a 、b 、c 、d 、e 、f 、g 、h 的顺序依次存储,邻接表的边表结点按顶点的下标由小到大链接)。

请画出其邻接表,并写出从顶点f 出发,分别进行深度和广度优先遍历的序列,写出用Prime 方法从顶点c开始产生最小生成树的边的序列。

4.(8分)已知键值序列为(44,39,67,25, 52,59,43,84,54,58,15,26,12,73,92,69),取填充因子α=0.8,采用线性探查法处理冲突,试构造散列表。

⒌(5分)已知一组记录为(67,88,15,12,60,37,7,31,45,81),用希尔排序方法进行排序,d1=5,d2=3,d3=1,则第二趟的排序结果是( )。

⒍(5分)已知一组记录为(67,88,15,12,60,37,7,31,45,81) ,用堆(大根堆)排序方法进行排序,第一趟的排序结果是( )。

二、完善程序(共20分,每空2分)1.假设一组递减有序的原始数据存储在数组r 中,存放元素的下标下限为low,下标上字符 出现频率 a 0.05 b 0.03 c 0.24 d 0.16 e 0.08 f 0.24 g 0.18 h0.02限为high,以下是在数组中查找数值为k的折半查找算法。

请填空完善程序。

int BinSearch(int r[ ], int low,int high,int k){ int l,h,m;l= low; h= high;while ( ⑴){m= ⑵;if (k < r[m]) ⑶;else if (k > r[m]) ⑷;else return m;}return 0;}2. 以下程序功能是将数组r中,从下标first到end之间的元素进行快速排序的分区。

数据结构(绪论)练习题与答案

数据结构(绪论)练习题与答案

1、计算机所处理的数据一般具备某种内在联系,这是指()。

A.数据和数据之间存在某种关系B.元素和元素之间存在某种关系C.元素内部具有某种结构D.数据项和数据项之间存在某种关系正确答案:B解析:在数据结构中讨论的关系指的是元素和元素之间的关系。

2、在数据结构中,与所使用的计算机无关的是数据的()结构。

A.逻辑B.存储C.逻辑和存储D.物理正确答案:A解析:逻辑结构与存储结构无关,也就是与使用的计算机无关。

3、在计算机中存储数据时,通常不仅要存储各数据元素的值,而且还要存储()。

A.数据的处理方法B.数据元素的类型C.数据元素之间的关系D.数据的存储方法正确答案:C解析:将数据逻辑结构映射成存储数据时,需要存储所有数据元素的值和数据元素之间关系。

4、数据结构在计算机内存中的表示是指()。

A.数据的存储结构B.数据结构C.数据的逻辑结构D.数据元素之间的关系正确答案:A解析:数据的存储结构是逻辑结构在计算机内存中的表示,它既保存数据元素,也保存数据元素之间的关系。

5、数据在计算机的存储器中表示时,逻辑上相邻的两个元素对应的物理地址也是相邻的,这种存储结构称之为()。

A.逻辑结构B.顺序存储结构C.链式存储结构D.以上都对正确答案:B解析:顺序存储结构是逻辑结构的一种直接映射,通过数据元素之间的物理关系来表示逻辑关系。

6、数据采用链式存储结构时,要求()。

A.每个节点占用一片连续的存储区域B.所有节点占用一片连续的存储区域C.节点的最后一个域必须是指针域D.每个节点有多少后继节点,就必须设多少个指针域正确答案:A解析:在链式存储结构中,通常一个结点是整体分配存储空间的,所以每个结点占用一片连续的存储区域,所有结点的存储地址既可以连续也可以不连续,所以所有结点不一定占用一片连续的存储区域。

7、可以用()定义一个完整的数据结构。

A.数据元素B.数据对象C.数据关系D.抽象数据类型正确答案:D解析:抽象数据类型指的是用户进行软件系统设计时从问题的数学模型中抽象出来的逻辑数据结构和逻辑数据结构上的运算,可以定义一个完整的数据结构。

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

数据结构练习1.填写下面表格,对以下几种排序方法进行比较:2.具有N个元素的顺序存储的循环队列中,假定front和rear分别指向队头元素的前一位置和队尾元素的位置,则判断队空的和队满的条件分别是f=r 和f=r mod m +1。

求此队列中元素个数的计算公式为:((r+m)-f-1) mod m +1。

入队运算:r:=r mod m+1。

出队运算:f:=f mod m + 1。

3.单链表是非顺序线性的链式存储结构,链栈和链队分别是和的链式存储结构。

4.线性表的顺序存储中,元素之间的逻辑关系是通过元素存储地址次序决定的,在线性表的链接存储中,元素之间的逻辑关系是通过元素存储指针地址访问决定的。

5.深度为5的二叉树至多有结点数为31。

6.数据结构即数据的逻辑结构包括顺性存储结构、链式存储结构、非线性结构三种类型,树型结构和图型结构称为非线性结构。

四种基本存储方法:(1)顺序存储方法(2)链接存储方法(3)索引存储方法(4)散列存储方法二.选择题1.有一个10阶对称矩阵,采用压缩存储方式,以行序为主序存储,A[0][0]的地址为1,则A[7][4]的地址为( C )A 13 B. 18 C. 33 D. 402.线性表采用链表存储时其存储地址 D 。

A.必须是连续的 B.部分地址必须是连续的C.一定是不连续的 D.连续不连续都可以3.下列叙述中错误的是 C 。

A.串是一种特殊的线性表,其特殊性体现在数据元素是一个字符B.栈和队列是两种特殊的线性表,栈的特点是后进先出,队列的特点是先进先出。

C.线性表的线性存储结构优于链式存储结构D.二维数组是其数据元素为线性表的线性表4.一棵二叉树的顺序存储结构如题图4-1所示,若中序遍历该二叉树,则遍历次序为A .A. DBEGACFHB. ABDEGCFHC. DGEBHFCAD. ABCDEFGH1 2 3 4 5 6 7 8 9 10 11 12 13 14题图4-15.设一棵二叉树的顺序存储结构如题图4-2所示,则该二叉树是 C .A.完全二叉树 B.满二叉树 C.深度为4 的二叉树D.深度为3的二叉树1 2 3 4 5 6 7 8 9 10 11题图4-26.设T是Huffman树,它具有6个树叶,且各树叶的权分别为1,2,3,4,5,6。

那么该树的非叶子结点的权之和为A。

A.51 B.21 C.30 D.497.设有一无向图的邻接矩阵如下所示,则该图所有顶点的度之和为C。

a b c d ea 0 1 1 1 0b 1 0 1 0 1c 1 1 0 0 0d 1 0 0 0 0e 0 1 0 0 0A .8B .9C .10D .118.已知二叉树的后序遍历序列是fedbgca ,中序遍历序列是dfebagc ,则该二叉树的先序遍历序列是 D 。

A .defbagcB .abcdgefC .dbaefcgD .abdefcg 9.由三个结点构成的二叉树,共有 C 种不同的形态。

A .3 B . 4 C . 5 D . 610.在一个具有n 个顶点的无向图中,要连通全部顶点至少需要 D 条边 A . n B .n+1 C .n/2 D .n-111.对线性表进行折半(二分)查找时,要求线性表必须 B 。

A .以顺序方式存储 B .以顺序方式存储且数据元素有序C .以链表方式存储D .以链表方式存储且数据元素有序12.顺序查找一个具有n 个元素的线性表,其时间复杂度为 A ,二分查找一个具有n 个元素的线性表,其时间复杂度为 B 。

A . O(n)B . O(log 2n)C . O(n 2) D .O(nlog 2n)13.从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列中的正确位置上,此方法称为 直接插入排序 ;从未排序序列中挑选元素,并将其放入已排序序列中的一端,此方法称为 直接选择排序 ;依次将每两个相临的有序表合并成一个有序表的排序方法称为 归并排序 ;当两个元素比较出现反序时就相互交换位置的排序方法称为 交换排序 ;A .归并排序B . 选择排序C .交换排序D .插入排序 三.简述下面的几个概念:单链表,栈、队列,排序二叉树。

四.简述空串和空格串的区别。

五.一棵度为2的树与二叉树有何区别? 六.试分别画出具有3个结点的树和具有3个结点的二叉树的所有不同形态。

七.已知一二叉树如题图4-3所示,1. 用二叉链表和顺序存储方式分别存储此二叉树。

画出相应的存储结构图。

2. 写出此二叉树的中序、先序、后序遍历序列。

八.已知一无向图如题图4-4所示,请给出该图的 1. 每个顶点的度。

2. 邻接矩阵3. 邻接表4. 按上述的邻接表写出广度和深度遍历序列。

九.已知一组数据元素为(46,75,18,54,15,27,42,39,88,67)图4-3题图4-41.利用直接插入排序方法,写出每次插入后的结果。

2.利用快速排序方法,写出每趟排序后的结果。

3.利用2-路归并排序方法,写出每趟归并后的结果。

4.利用冒泡排序方法,写出每趟排序后的结果。

十.假定一个表为(32,75,63,48,94,25,36,18,70),散列空间为[0..10],1.若采用除留余数法构造表,哈希函数为H(K)=K MOD 11,用线性探测法解决冲突,试画出哈希表,并求在等概率情况下的平均查找长度。

2.若采用除留余数法构造表,哈希函数为H(K)=K MOD 11,用链地址法解决冲突,试画出哈希表,并求在等概率情况下的平均查找长度。

十一.有8个带权结点,权值为(3,7,8,2,6,10,14,9),试以它们为叶子结点构造一棵哈夫曼树(要求每个结点左子树的权值小于等于右子树的权值),并计算出带权路径长度。

十二.一对称阵A n*n,若只存储此对称阵的上半三角元,写出以行为主序存储和以列为主序存储时计算每一元素A ij存储地址的公式。

十三.算法设计1.写出在循环单链表L中查找查找第i个元素的算法:SEARCH(L,i)。

2.设有如下题图4-3的单链表,链表头指针为H,写一个将链表进行逆转的算法,逆转以后的链表为题图4-4所示。

题图4-4单链表示意图3.假定用一个带头结点的循环单链表表示循环队列(循环链队),该队列只设一个队尾指针,不设头指针,试编写下面的算法:A.向循环链队中插入一个元素x的算法(入队)。

B.从循环链队中删除一个结点(出队)。

4.数组A[N]存放循环队列中的元素,同时设两个变量分别存储队尾元素的位置和队列中实际元素个数。

A.写出此队列的队满条件。

B.写出此队列的出、入队算法。

5.设LA和LB为两个顺序存储的线性表,且元素按非递减排列,写出算法将其合并为LC,且LC中的元素也按非递减排列。

6.已知一个由n个整数组成的线性表,请定义该线性表的一种存储结构,并用C语言编写算法,实现将n个元素中所有大于等于20的整数放在所有小于等于20的整数之后,要求算法的时间复杂度为O(n),空间复杂度为O(1)。

7.编写算法,计算二叉树中叶子结点的数目。

8.编写一个按层次顺序(同一层自左向右)遍历二叉树的算法。

三种基于“分配”“收集”的线性排序算法---计数排序、桶排序与基数排序文中代码见原文链接:/blog/sort-radix/[非基于比较的排序]在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销。

排序算法有非常多种,如我们最常用的快速排序和堆排序等算法,这些算法需要对序列中的数据进行比较,因为被称为基于比较的排序。

基于比较的排序算法是不能突破O(NlogN)的。

简单证明如下:N个数有N!个可能的排列情况,也就是说基于比较的排序算法的判定树有N!个叶子结点,比较次数至少为log(N!)=O(NlogN)(斯特林公式)。

而非基于比较的排序,如计数排序,桶排序,和在此基础上的基数排序,则可以突破O(NlogN)时间下限。

但要注意的是,非基于比较的排序算法的使用都是有条件限制的,例如元素的大小限制,相反,基于比较的排序则没有这种限制(在一定范围内)。

但并非因为有条件限制就会使非基于比较的排序算法变得无用,对于特定场合有着特殊的性质数据,非基于比较的排序算法则能够非常巧妙地解决。

本文着重介绍三种线性的非基于比较的排序算法:计数排序、桶排序与基数排序。

[计数排序]首先从计数排序(Counting Sort)开始介绍起,假设我们有一个待排序的整数序列A,其中元素的最小值不小于0,最大值不超过K。

建立一个长度为K的线性表C,用来记录不大于每个值的元素的个数。

算法思路如下:•扫描序列A,以A中的每个元素的值为索引,把出现的个数填入C中。

此时C[i]可以表示A中值为i的元素的个数。

•对于C从头开始累加,使C[i]<-C[i]+C[i-1]。

这样,C[i]就表示A中值不大于i 的元素的个数。

•按照统计出的值,输出结果。

123 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2425 26 27 28 2930 31 32 33 34/* Memo: 计数排序*/ #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> using namespace std ;void CountingSort (int *A,int *B,int *Order,int N,int K ) { int *C =new int [K +1]; int i ; memset (C,0,sizeof (int )*(K +1)); for (i =1;i <=N ;i ++) //把A 中的每个元素分配 C [A [i ]]++; for (i =2;i <=K ;i ++) //统计不大于i 的元素的个数 C [i ]+=C [i -1]; for (i =N ;i >=1;i --) { B [C [A [i ]]]=A [i ]; //按照统计的位置,将值输出到B 中,将顺序输出到Order 中 Order [C [A [i ]]]=i ; C [A [i ]]--; } } int main () { int *A,*B,*Order,N =15,K =10,i ; A =new int [N +1]; B =new int [N +1];353637383940414243444546474849 Order=new int[N+1];for(i=1;i<=N;i++)A[i]=rand()%K+1;//生成1..K的随机数printf("Before CS:/n");for(i=1;i<=N;i++)printf("%d ",A[i]);CountingSort(A,B,Order,N,K);printf("/n After CS:/n");for(i=1;i<=N;i++)printf("%d ",B[i]);printf("/n Order:/n");for(i=1;i<=N;i++)printf("%d ",Order[i]);return0;}程序运行效果如下:Before CS:2 8 5 1 10 5 9 93 5 6 6 2 8 2After CS:1 2 2 2 3 5 5 5 6 6 8 8 9 9 10Order:4 1 13 15 9 36 10 11 12 2 1478 5显然地,计数排序的时间复杂度为O(N+K),空间复杂度为O(N+K)。

相关文档
最新文档