数据结构中排序总结

排序总结

排序方法 平均时间 最坏时间 辅助存储

简单排序 O(n2) O(n2) O(1)

快速排序 O(nlogn) O(n2) O(logn)

堆排序 O(nlogn) O(nlogn) O(1)

归并排序 O(nlogn) O(nlogn) O(n)

另外:直接插入排序、冒泡排序为简单排序,希尔排序(不稳定)

一、时间性能

按平均的时间性能来分,有三类排序方法:

时间复杂度为O(nlogn)的方法有:快速排序、堆排序和归并排序,其中以快速排序为最好;

时间复杂度为O(n2)的有:直接插入排序、起泡排序和简单选择排序,其中以直接插入为

最好,特别是对那些对关键字近似有序的记录序列尤为如此;

当待排记录序列按关键字顺序有序时,直接插入排序和起泡排序能达到O(n)的时间复杂

度;而对于快速排序而言,这是最不好的情况,此时的时间性能蜕化为O(n2),因此是应

该尽量避免的情况。

简单选择排序、堆排序和归并排序的时间性能不随记录序列中关键字的分布而改变。

二、空间性能

指的是排序过程中所需的辅助空间大小。

1. 所有的简单排序方法(包括:直接插入、起泡和简单选择)和堆排序的空间复杂度为O(1);

2. 快速排序为O(logn),为栈所需的辅助空间;

3. 归并排序所需辅助空间最多,其空间复杂度为O(n);

三、排序方法的稳定性能

1. 稳定的排序方法指的是,对于两个关键字相等的记录,它们在序列中的相对位置,在

排序之前和经过排序之后,没有改变。

2. 当对多关键字的记录序列进行LSD方法排序时,必须采用稳定的排序方法。

3. 对于不稳定的排序方法,只要能举出一个实例说明即可。

4. 希尔排序、快速排序和堆排序是不稳定的排序方法

四、应用

归并排序很难用于主存排序,主要问题在于:合并两个排序的表需要线性附加内存,在整个算法中还要花费将数据拷贝到临时数组再拷贝回来这样一些附加的工作,其结果严重放慢了排序的速度。

对于重要的内部排序应用而言,应选择快速排序。

快排和归并排序都是分治的递归算法。

对于很小的数组(N<=20),快速排序不如插入排序好。

 

第二篇:数据结构总结

本学期开设的《数据结构与算法》课程已经告一段落,现就其知识点及其掌握情况、学习体会以及对该门课程的教学建议等方面进行学习总结。一、《数据结构与算法》知识点在课本的第一章便交代了该学科的相关概念,如数据、数据元素、数据类型以及数据结构的定义。其中,数据结构包括逻辑结构、存储结构和运算集合。逻辑结构分为四类:集合型、线性、树形和图形结构,数据元素的存储结构分为:顺序存储、链接存储、索引存储和散列存储四类。紧接着介绍了一些常用的数据运算。最后着重介绍算法性能分析,包括算法的时间性能分析以及算法的空间性能分析。第二章具体地介绍了顺序表的概念、基本运算及其应用。基本运算有:初始化表、求表长、排序、元素的查找、插入及删除等。元素查找方法有:简单顺序查找、二分查找和分块查找。排序方法有:直接插入排序、希尔排序、冒泡排序、快速排序、直接选择排序及归并排序等。最后介绍了顺序串的概念,重点在于串的模式匹配。链表中数据元素的存储不一定是连续的,还可以占用任意的、不连续的物理存储区域。与顺序表相比,链表的插入、删除不需要移动元素,给算法的效率带来较大的提高。链表这一章中介绍了链表的节点结构、静态与动态链表的概念、链表的基本运算(如求表长、插入、查找、删除等)、单链表的建立(头插法和尾插法)以及双向循环链表的定义、结构、功能和基本算法。堆栈与队列是两种运算受限制的线性结构。其基本运算方法与顺序表和链表运算方法基本相同,不同的是堆栈须遵循“先进后出”的规则,对堆栈的操作只能在栈顶进行;而队列要遵循“先进先出”的规则,教材中列出了

两种结构的相应算法,如入栈、出栈、入队、出队等。在介绍队列时,提出了循环队列的概念,以避免“假溢出”的现象。第六章介绍了特殊矩阵和广义表的概念与应用。其中,特殊矩阵包括对称矩阵、三角矩阵、对角矩阵和稀疏矩阵,书中分别详细介绍了它们的存储结构。稀疏矩阵的应用包括转置和加法运算等。最后介绍了广义表的相关概念及存储结构,关于它的应用,课本中举了m元多项式的表示问题。

第七章二叉树的知识是重点内容。在介绍有关概念时,提到了二叉树的性质以及两种特殊的二叉树:完全二叉树和满二叉树。接着介绍二叉树的顺序存储和链接存储以及生成算法。重点介绍二叉树的遍历算法(递归算法、先序、中序和后序遍历非递归算法)和线索二叉树。二叉树的应用:基本算法、哈弗曼树、二叉排序树和堆排序。树与二叉树是不同的概念。教材介绍了树和森林的概念、遍历和存储结构,还有树、森林和二叉树的相互关系,树或森林怎样转化成二叉树,二叉树又如何转换为树和森林等算法。散列结构是一种查找效率很高的一种数据结构。本章的主要知识点有:散列结构的概念及其存储结构、散列函数、两种冲突处理方法、线性探测散列和链地址散列的基本算法以及散列结构的查找性能分析。最后一章介绍了图的概念及其应用,是本书的难点。图的存储结构的知识点有:邻接矩阵、邻接表、逆邻接表、十字链表和邻接多重表。图的遍历包括图的深度优先搜索遍历和广度优先搜索遍历。其余知识点有:有向图、连通图、生成树和森林、最短路径问题和有向无环图及其应用。有向无环图重点理解AOV网和拓扑排序及其算法。二、对各知识点的掌握情况总体来看,对教

材中的知识点理解较为完善,但各个章节均出现有个别知识点较为陌生的现象。现将各个章节出现的知识点理解情况列举如下。第一章中我对数据和数据结构的概念理解较为透彻,熟悉数据结构的逻辑结构和存储结构。而对算法的时间、空间性能分析较为模糊,尤其是空间性能分析需要加强。第二章,顺序表的概念、生成算法理解较为清晰,并且熟悉简单顺序查找和二分查找,对分块查找较为含糊;排序问题中,由于冒泡排序在大一C语言课上已经学习过,再来学习感觉很轻松。对插入排序和选择排序理解良好,但是,在实际运用中仍然出现明显不熟练的现象。由于在归并排序学习中感觉较吃力,现在对这种排序方法仍然非常模糊,所以需要花较多的时间来补习。此外串的模式匹配也是较难理解的一个地方。链表这一章中,除对双向循环链表这一知识点理解困难之外,其他的知识点像单链表的建立和基本算法等都较为熟悉。接下来的有关堆栈以及队列的知识点比较少,除有关算法较为特殊以外,其余算法都是先前学过的顺序表和链表的知识,加上思想上较为重视,因此这部分内容是我对全书掌握最好的一部分。不足之处仍然表现在算法的性能分析上。在学习第六章时感觉较为吃力的部分在于矩阵的应用上,尤其对矩阵转置算法的C语言描述不太理解。稀疏矩阵相加算法中,用三元组表实现比较容易理解,对十字链表进行矩阵相加的方法较为陌生。第七章是全书的重点,却也有一些内容没有完全理解。在第一节基本概念中,二叉树的性质容易懂却很难记忆。对二叉树的存储结构和遍历算法这部分内容掌握较好,能够熟练运用,而对于二叉树应用中的哈弗曼树却比较陌生。第八章内

容较少,牵涉到所学的队列的有关内容,总体来说理解上没有什么困难,问题依旧出现在算法的性能分析上。散列结构这一章理解比较完善的知识点有:基本概念和存储结构。散列函数中直接定址法和除留余数法学得比较扎实,对数字分析法等方法则感觉较为陌生。对两种冲突处理的算法思想的理解良好,问题在于用C语言描述上。最后一章,图及其应用中,图的定义、基本运算如图的生成等起初理解有困难,但随着学习深入,对它的概念也逐步明朗起来。邻接矩阵、邻接表和逆邻接表掌握较好,而对十字链表和邻接多重表则较为陌生。感觉理解较为吃力的内容还有图的遍历(包括深度和广度优先遍历),最小生成树问题也是比较陌生的知识点。最短路径和AOV网学习起来感觉比较轻松,而对于C语言描述却又不大明白。三、学习体会接触这门课程以前,我对该课程所学的内容有许多疑点,例如:这门课是否是在介绍一种新的计算机语言?如果不是,那么学习这门课程的用途是什么?为什么市面上各种介绍数据结构的资料采用了不同的计算机语言,如C、C++还有Java?我的C语言学得不好,对学习这门课是否有影响??在学习伊始,老师就明确提出它不是一种计算机语言,不会介绍新的关键词,而是通过学习可以设计出良好的算法,高效地组织数据。一个程序无论采用何种语言,其基本算法思想不会改变。联系到在大一和大二上学期学习的C和C++语言,我深刻认识到了这一点。“软件开发好比写作文,计算机语言提供了许多华丽的辞藻,而数据结构则考虑如何将这些辞藻组织成一篇优秀的文章来。”在学习这门课中,要熟悉对算法思想的一些描述手段,包括文字描述、

图形描述和计算机语言描述等。因此,计算机语言基础是必须的,因为它提供了一种重要的算法思想描述手段——机器可识别的描述。这门课结束之后,我总结了学习中遇到的一些问题,最为突出的,书本上的知识与老师的讲解都比较容易理解,但是当自己采用刚学的知识点编写程序时却感到十分棘手,有时表现在想不到适合题意的算法,有时表现在算法想出来后,只能将书本上原有的程序段誊写到自己的程序中再加以必要的连接以完成程序的编写。针对这一情况,我会严格要求自己,熟练掌握算法思想,尽量独立完成程序的编写与修改工作,只有这样,才能够提高运用知识,解决问题的能力。四、对《数据结构与算法》课程教学的建议1、建议在上课过程中加大随堂练习的分量,以便学生能当堂消化课堂上学习的知识,也便于及时了解学生对知识点的掌握情况,同时有助于学生保持良好的精神状态。2、建议在课时允许的情况下,增加习题课的分量,通过课堂的习题讲解,加深对知识点的掌握,同时对各知识点的运用有一个更为直观和具体的认识。以上便是我对《数据结构与算法》这门课的学习总结,我会抓紧时间将没有吃透的知识点补齐。今后我仍然会继续学习,克服学习中遇到的难关,在打牢基础的前提下向更深入的层面迈进!

相关推荐