
数据结构和算法
Rap_God
渣渣一个
展开
-
C++双向循环链表
一.概念双向链表和单向链表相比,每一个结点都多了一个指针域,即共有两个指针域,一个指向后继结点,另一个指向前驱结点,如图因此双向链表可以向两个方向移动,不像单向链表那样只能从头到尾进行查找,双向链表相当于牺牲空间换取时间的做法。当双向链表的头尾相连时,形成了双向循环链表。当双向循环链表为空时,其头结点的两个指针域均指向自己,不为空时,形成循环链表的具体做法是:最后一个结点的后继指针指向头结点后的第...原创 2018-03-14 21:52:42 · 599 阅读 · 0 评论 -
堆排序
基本概念堆排序是指利用堆这种数据结构进行排序的排序算法,堆排序是一种选择排序,最好、最坏,平均时间复杂度均为O(nlogn)。堆:堆是具有以下性质的完全二叉树:当其每个结点的值都大于或等于其左右孩子结点的值时,称为大顶堆;当其每个结点的值都小于或等于其左右孩子结点的值时,称为小顶堆。如下图所示以大顶堆为例,对堆中的结点按层进行编号,从0开始,那么将这种结构按顺序写入数组中就是下图中的样子则大顶堆及...原创 2018-04-28 16:44:00 · 245 阅读 · 0 评论 -
快速排序的几个优化
快排代码的第一句便是选取基准点,此后数据的移动根据这个基准点的大小进行调整,如果基准点选取的不好,将会导致快排的效率低下,经过测试,普通的快排算法针对(1)近乎有序的数列;(2)含有大量重复数据的数列;这两种情况时效率将会变得非常低,针对这些情况,经过适当的优化可以使快排达到很高的效率。1.三数取中法和随机交换法快排将选取的基准点经过调整放到合适的位置,之后将这个基准点左右两边的区间分别递归的进行...原创 2018-05-06 13:08:19 · 3956 阅读 · 0 评论 -
快速排序
看到一篇讲快排比较容易理解的文章,实在佩服!快速排序是另一种排序算法,不像希尔排序,堆排序那样,要么以发明的人的名字命名,要么以使用的数据结构或特点命名,而快速排序直接嚣张的命名为快速排序!而实际上,快速排序确实是几个复杂度为O(nlogn)的排序算法中效率最高的一种,自然也就敢如此霸气的命名了。快速排序的思想是:1.先从数组中取出一个数作为基准数。2.分区:将比这个数大的数全部放到它的右边,比他...原创 2018-05-05 12:59:39 · 262 阅读 · 0 评论 -
插入排序和希尔排序
插入排序思想:插入排序的思想是将一个无需的数列中的数据挨个插入到一个已经有序的数列中,使得插入后原本有序的数列依然有序,最终完成整个数列的排序。在实际的排序过程中,“已经有序的数列”指的是数列中被拍好序的部分。考虑对下图的数组进行插入排序:首先考虑6这个元素,因为第一个元素8只有它自己,是已经排好序的。考虑6时将6这个元素插入到有序部分“8”中,6应该在8的前面,因此这一步结束后数组为接下来考虑2...原创 2018-04-21 16:49:32 · 234 阅读 · 0 评论 -
归并排序的优化
1.合并代码的优化上节中的数组合并代码中,没有做任何判断就进行了数组的合并,实际上当数组1的最后一个元素小于数组2的第一个元素时,根本不需要挨个对比、复制元素进行合并操作,此时数组1和数组2本来就是有序的,不需要合并,因此代码改为(部分代码)MergeSort1(list1, listSize1);MergeSort1(list2, listSize2);if (list1[listSize1...原创 2018-04-30 16:30:30 · 673 阅读 · 1 评论 -
冒泡排序和选择排序
两个比较简单的排序算法就放到一起写了1.冒泡排序1.1思想冒泡排序的思想是比较两两相邻的关键字,如果反序则进行交换,直到没有反序的为止。设想一个数组按照升序排列,经过第一轮比较之后最大的数就被放在最后了,因此剩下的比较中就不需要将它再参与进来,第二轮比较中第二大的数据被放在了倒数第二的位置,它的位置也就股定了,也不需要参与剩余的比较。因此我们需要两层循环,外层循环控制比较的轮数,和数组元素的个数有...原创 2018-04-18 20:14:40 · 19003 阅读 · 3 评论 -
图(一)
1.概念1.1一些定义图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为G(V,E),G表示一个图,V是图中顶点的集合,E是图G中边的集合。注:线性表中的数据叫元素;树中叫结点;图中称为顶点(Vertex)。线性表中可以没有元素,树中可以没有结点,但图中不能没有顶点,可以没有边。无向边:顶点Vi和Vj之间的边没有方向,成这条边为无向边,用(Vi,Vj)表示。无向图:图中任意两...原创 2018-04-06 22:41:17 · 2425 阅读 · 0 评论 -
二叉树的创建和遍历
1.概念二叉树是树结构的一种,规定每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。注:不是都需要两棵子树,而是最多!二叉树的左子树和右子树是有顺序的,不能颠倒,颠倒了那就是不同的树,即使只有一个子树也是要区分顺序的,如下是两个完全不同的二叉树二叉树存在以下五种基本形态满二叉树:如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,即上图中最右边那个树,只有最下一层是叶子。完全二...原创 2018-03-31 21:14:11 · 282 阅读 · 0 评论 -
动态单向链表的C++实现
一.概念链表是一种特殊的数组,它的每个元素称为节点,每个节点包括两个部分:数据域:存放数据,此部分与数组相同指针域:存放了下一个节点的地址(单向链表)、存放上一个和下一个节点的地址(双向链表)其结构如下图所示链表比数组多了指针域,因为链表结构是通过上一个节点的指针域去找下一个数据,比如有一个链表ABCD四个节点,其中A节点是链表的第一个节点,如果要访问D节点里边的数据。操作如下:先通过A节点的指针...原创 2018-03-12 20:30:39 · 976 阅读 · 0 评论 -
循环队列的C++实现
1.概念队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,进行插入操作的一端称为队尾,插入操作为入队;进行删除操作的一端称为队头,删除操作为出队。队列的特点即先入先出。首先了解下线性队列是如何实现的即使用两个指针分别指向队头和队尾的位置,进行插入和删除操作时分别对队尾和队头的指针进行相应操作。但是这种做法会导致一些问题,如下图随着部分元素的...原创 2018-03-17 20:10:56 · 4231 阅读 · 0 评论 -
归并排序
思想归并排序是建立在归并操作上的一种排序算法,该算法是采用分治法的典型应用。算法的目的是将长的无序数列递归的划分成小的数列,对小的数列进行排序后再进行合并操作,最终完成整个数列的排序。这么说有点粗略了,下面看详细步骤。有序数列的合并操作假设一个数组共8个元素,其中左右两组分别已经排好序了,下面看如何进行合并排序成一个大的数组a.对于合并的步骤,需要借用一个临时存储空间,该空间大小等于待合并的两个数...原创 2018-04-29 17:11:20 · 203 阅读 · 0 评论