随笔分类 -  数据结构

摘要:本栏目专门用来分享与数据结构和算法有关的源码,这些源码都是用心整理的,并且附带了注释、思路解析以及精美图片。重要的是,这些源码都是免费的。 稀疏矩阵的三元组表示(带源码+解析) 头结点和头指针在链表中的作用 链表节点的插入,链表插入节点 哈夫曼(赫夫曼,哈弗曼)编码算法(带源码+解析) 二叉树遍历算 阅读全文
posted @ 2018-05-23 11:12 程序员进阶笔记 阅读(1178) 评论(0) 推荐(0) 编辑
摘要:链表翻转,简单地理解,就是将链表的头部结点变为链表的尾部结点,与此同时将原链表的尾部结点变成头部结点。如下图所示: 图 1 链表翻转示意图 提示:H 为头指针,图示中的链表无头结点,头指针直接指向首元结点。 将链表进行翻转的方法有多种,本节给大家介绍两种实现方法。 方法一 实现链表翻转最直接的方法就 阅读全文
posted @ 2018-05-23 11:11 程序员进阶笔记 阅读(1355) 评论(0) 推荐(1) 编辑
摘要:基数排序不同于之前所介绍的各类排序,前边介绍到的排序方法或多或少的是通过使用比较和移动记录来实现排序,而基数排序的实现不需要进行对关键字的比较,只需要对关键字进行“分配”与“收集”两种操作即可完成。 例如对无序表{50,123,543,187,49,30,0,2,11,100}进行基数排序,由于每个 阅读全文
posted @ 2018-05-23 10:53 程序员进阶笔记 阅读(1334) 评论(0) 推荐(0) 编辑
摘要:本节介绍一种不同于插入排序和选择排序的排序方法——归并排序,其排序的实现思想是先将所有的记录完全分开,然后两两合并,在合并的过程中将其排好序,最终能够得到一个完整的有序表。 例如对于含有 n 个记录的无序表,首先默认表中每个记录各为一个有序表(只不过表的长度都为 1),然后进行两两合并,使 n 个有 阅读全文
posted @ 2018-05-23 10:47 程序员进阶笔记 阅读(954) 评论(0) 推荐(0) 编辑
摘要:本节介绍三种选择排序算法,分别为:简单选择排序、树形选择排序和堆排序。 简单选择排序 该算法的实现思想为:对于具有 n 个记录的无序表遍历 n-1 次,第 i 次从无序表中第 i 个记录开始,找出后序关键字中最小的记录,然后放置在第 i 的位置上。例如对无序表{56,12,80,91,20}采用简单 阅读全文
posted @ 2018-05-23 10:39 程序员进阶笔记 阅读(5544) 评论(0) 推荐(2) 编辑
摘要:上节介绍了如何使用起泡排序的思想对无序表中的记录按照一定的规则进行排序,本节再介绍一种排序算法——快速排序算法(Quick Sort)。 C语言中自带函数库中就有快速排序——qsort函数 ,包含在 <stdlib.h> 头文件中。 快速排序算法是在起泡排序的基础上进行改进的一种算法,其实现的基本思 阅读全文
posted @ 2018-05-23 09:45 程序员进阶笔记 阅读(1899) 评论(0) 推荐(0) 编辑
摘要:起泡排序,别名“冒泡排序”,该算法的核心思想是将无序表中的所有记录,通过两两比较关键字,得出升序序列或者降序序列。 例如,对无序表{49,38,65,97,76,13,27,49}进行升序排序的具体实现过程如图 1 所示: 图 1 第一次起泡 如图 1 所示是对无序表的第一次起泡排序,最终将无序表中 阅读全文
posted @ 2018-05-23 09:38 程序员进阶笔记 阅读(14427) 评论(0) 推荐(3) 编辑
摘要:希尔排序,又称“缩小增量排序”,也是插入排序的一种,但是同前面几种排序算法比较来看,希尔排序在时间效率上有很大的改进。 在使用直接插入排序算法时,如果表中的记录只有个别的是无序的,多数保持有序,这种情况下算法的效率也会比较高;除此之外,如果需要排序的记录总量很少,该算法的效率同样会很高。希尔排序就是 阅读全文
posted @ 2018-05-23 09:35 程序员进阶笔记 阅读(2799) 评论(0) 推荐(0) 编辑
摘要:前面章节中所介绍到的三种插入排序算法,其基本结构都采用数组的形式进行存储,因而无法避免排序过程中产生的数据移动的问题。如果想要从根本上解决只能改变数据的存储结构,改用链表存储。表插入排序,即使用链表的存储结构对数据进行插入排序。在对记录按照其关键字进行排序的过程中,不需要移动记录的存储位置,只需要更 阅读全文
posted @ 2018-05-23 09:31 程序员进阶笔记 阅读(7523) 评论(0) 推荐(1) 编辑
摘要:2-路插入排序算法是在折半插入排序的基础上对其进行改进,减少其在排序过程中移动记录的次数从而提高效率。 具体实现思路为:另外设置一个同存储记录的数组大小相同的数组 d,将无序表中第一个记录添加进 d[0] 的位置上,然后从无序表中第二个记录开始,同 d[0] 作比较:如果该值比 d[0] 大,则添加 阅读全文
posted @ 2018-05-23 09:26 程序员进阶笔记 阅读(540) 评论(0) 推荐(0) 编辑
摘要:上一节介绍了直接插入排序算法的理论实现和具体的代码实现,如果你善于思考就会发现该算法在查找插入位置时,采用的是顺序查找的方式,而在查找表中数据本身有序的前提下,可以使用折半查找来代替顺序查找,这种排序的算法就是折半插入排序算法。 该算法的具体代码实现为: 折半插入排序算法相比较于直接插入排序算法,只 阅读全文
posted @ 2018-05-23 09:23 程序员进阶笔记 阅读(1138) 评论(0) 推荐(0) 编辑
摘要:插入排序算法是所有排序方法中最简单的一种算法,其主要的实现思想是将数据按照一定的顺序一个一个的插入到有序的表中,最终得到的序列就是已经排序好的数据。 直接插入排序是插入排序算法中的一种,采用的方法是:在添加新的记录时,使用顺序查找的方式找到其要插入的位置,然后将新记录插入。 很多初学者所说的插入排序 阅读全文
posted @ 2018-05-23 09:20 程序员进阶笔记 阅读(777) 评论(0) 推荐(0) 编辑
摘要:排序算法 本章详细介绍多种排序算法:插入排序算法、快速排序算法、选择排序算法、归并排序和基数排序等,不仅介绍算法的理论实现,还有可运行的完整代码以及讨论各自的时间复杂度。 本章内容:1. 插入排序算法2. 折半插入排序算法(折半排序算法)3. 2-路插入排序算法4. 表插入排序算法5. 希尔排序算法 阅读全文
posted @ 2018-05-23 09:16 程序员进阶笔记 阅读(372) 评论(0) 推荐(0) 编辑
摘要:上一节介绍了有关哈希表及其构造过程的相关知识,本节将介绍如何利用哈希表实现查找操作。 在哈希表中进行查找的操作同哈希表的构建过程类似,其具体实现思路为:对于给定的关键字 K,将其带入哈希函数中,求得与该关键字对应的数据的哈希地址,如果该地址中没有数据,则证明该查找表中没有存储该数据,查找失败:如果哈 阅读全文
posted @ 2018-05-21 16:09 程序员进阶笔记 阅读(898) 评论(0) 推荐(0) 编辑
摘要:前面介绍了静态查找表以及动态查找表中的一些查找方法,其查找的过程都无法避免同查找表中的数据进行比较,查找算法的效率很大程度取决于同表中数据的查找次数。而本节所介绍的哈希表可以通过关键字直接找到数据的存储位置,不需要进行任何的比较,其查找的效率相较于前面所介绍的查找算法是更高的。 哈希表的构建 在初中 阅读全文
posted @ 2018-05-21 16:05 程序员进阶笔记 阅读(2811) 评论(0) 推荐(0) 编辑
摘要:红黑树(R-B TREE,全称:Red-Black Tree),本身是一棵二叉查找树,在其基础上附加了两个要求: 树中的每个结点增加了一个用于存储颜色的标志域; 树中没有一条路径比其他任何路径长出两倍,整棵树要接近于“平衡”的状态。 这里所指的路径,指的是从任何一个结点开始,一直到其子孙的叶子结点的 阅读全文
posted @ 2018-05-21 15:45 程序员进阶笔记 阅读(789) 评论(0) 推荐(1) 编辑
摘要:上一节介绍如何使用二叉排序树实现动态查找表,本节介绍另外一种实现方式——平衡二叉树。平衡二叉树,又称为 AVL 树。实际上就是遵循以下两个特点的二叉树: 每棵子树中的左子树和右子树的深度差不能超过 1; 二叉树中每棵子树都要求是平衡二叉树; 其实就是在二叉树的基础上,若树中每棵子树都满足其左子树和右 阅读全文
posted @ 2018-05-21 15:03 程序员进阶笔记 阅读(1053) 评论(0) 推荐(0) 编辑
摘要:前几节介绍的都是有关静态查找表的相关知识,从本节开始介绍另外一种查找表——动态查找表。 动态查找表中做查找操作时,若查找成功可以对其进行删除;如果查找失败,即表中无该关键字,可以将该关键字插入到表中。动态查找表的表示方式有多种,本节介绍一种使用树结构表示动态查找表的实现方法——二叉排序树(又称为“二 阅读全文
posted @ 2018-05-21 14:51 程序员进阶笔记 阅读(11006) 评论(0) 推荐(0) 编辑
摘要:前面章节所介绍的有关在静态查找表中对特定关键字进行顺序查找、折半查找或者分块查找,都是在查找表中各关键字被查找概率相同的前提下进行的。 例如查找表中有 n 个关键字,表中每个关键字被查找的概率都是 1/n。在等概率的情况,使用折半查找算法的性能最优。 而在某些情况下,查找表中各关键字被查找的概率是不 阅读全文
posted @ 2018-05-21 14:39 程序员进阶笔记 阅读(2859) 评论(0) 推荐(1) 编辑
摘要:本节介绍一种在顺序查找的基础上对其进行改进的算法——分块查找算法。 分块查找,也叫索引顺序查找,算法实现除了需要查找表本身之外,还需要根据查找表建立一个索引表。例如图 1,给定一个查找表,其对应的索引表如图所示: 图 1 查找表及其对应的索引表 图 1 中,查找表中共 18 个查找关键字,将其平均分 阅读全文
posted @ 2018-05-21 14:29 程序员进阶笔记 阅读(13553) 评论(0) 推荐(2) 编辑