吴裕雄--天生自然数据结构:循环链表(约瑟夫环)的建立
摘要:无论是静态链表还是动态链表,有时在解决具体问题时,需要我们对其结构进行稍微地调整。比如,可以把链表的两头连接,使其成为了一个环状链表,通常称为循环链表。 只需要将表中最后一个结点的指针指向头结点,链表就能成环儿 需要注意的是,虽然循环链表成环状,但本质上还是链表,因此在循环链表中,依然能够找到头指针
阅读全文
吴裕雄--天生自然数据结构:双向链表基本操作
摘要:根据数据添加到双向链表中的位置不同,可细分为以下 3 种情况: 添加至表头 将新数据元素添加到表头,只需要将该元素与表头元素建立双层逻辑关系即可。 换句话说,假设新元素节点为 temp,表头节点为 head,则需要做以下 2 步操作即可: temp->next=head; head->prior=t
阅读全文
吴裕雄--天生自然数据结构:双向链表及创建
摘要:无论是动态链表还是静态链表,表中各节点中都只包含一个指针(游标),且都统一指向直接后继节点,通常称这类链表为单向链表(或单链表)。 虽然使用单链表能 100% 解决逻辑关系为 "一对一" 数据的存储问题,但在解决某些特殊问题时,单链表并不是效率最优的存储结构。比如说,如果算法中需要大量地找某指定结点
阅读全文
吴裕雄--天生自然数据结构:静态链表基本操作
摘要:静态链表添加元素 从备用链表中摘除一个节点,用于存储元素 4; 找到表中第 2 个节点(添加位置的前一个节点,这里是数据元素 2),将元素 2 的游标赋值给新元素 4; 将元素 4 所在数组中的下标赋值给元素 2 的游标; //向链表中插入数据,body表示链表的头结点在数组中的位置,add表示插入
阅读全文
吴裕雄--天生自然数据结构:静态链表及其创建
摘要:静态链表,也是线性存储结构的一种,它兼顾了顺序表和链表的优点于一身,可以看做是顺序表和链表的升级版。 使用静态链表存储数据,数据全部存储在数组中(和顺序表一样),但存储位置是随机的,数据之间"一对一"的逻辑关系通过一个整形变量(称为"游标",和指针功能类似)维持(和链表类似)。 创建一个足够大的数组
阅读全文
吴裕雄--天生自然数据结构:单链表的基本操作
摘要:创建链表的代码如下所示: //声明节点结构 typedef struct Link{ int elem;//存储整形元素 struct Link *next;//指向直接后继元素的指针 }link; //创建链表的函数 link * initLink(){ link * p=(link*)mallo
阅读全文
吴裕雄--天生自然数据结构:单链表,链式存储结构
摘要:链表,别名链式存储结构或单链表,用于存储逻辑关系为 "一对一" 的数据。与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。 数据元素随机存储,并通过指针表示数据之间逻辑关系的存储结构就是链式存储结构。 链表中每个数据的存储都由以下两部分组成: 数据
阅读全文
吴裕雄--天生自然数据结构:顺序表的基本操作
摘要:顺序表插入元素 向已有顺序表中插入数据元素,根据插入位置的不同,可分为以下 3 种情况: 插入到顺序表的表头; 在表的中间位置插入元素; 尾随顺序表中已有元素,作为顺序表中的最后一个元素; 虽然数据元素插入顺序表中的位置有所不同,但是都使用的是同一种方式去解决,即:通过遍历,找到数据元素要插入的位置
阅读全文
吴裕雄--天生自然数据结构:线性表(线性存储结构)
摘要:线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来,再存储到物理空间中”。如图 将具有“一对一”关系的数据“线性”地存储到物理空间中,这种存储结构就称为线性存储结构(简称线性表)。 使用线性表存储的数据,如同向数组中存储数据那样,要求数据类型必须一致,也
阅读全文
吴裕雄--天生自然数据结构:算法时间复杂度和空间复杂度
摘要:算法,即解决问题的方法。同一个问题,使用不同的算法,虽然得到的结果相同,但是耗费的时间和资源是不同的。 就比如要拧一个螺母,使用扳手还是钳子是有区别的,虽然使用钳子也能拧螺母,但是没有扳手好用。 很多人误以为程序就是算法,其实不然:算法是解决某个问题的想法、思路;而程序是在心中有算法的前提下编写出来
阅读全文
吴裕雄--天生自然数据结构:常用数据结构
摘要:数据结构是学习数据存储方式的一门学科 数据结构大致包含以下几种存储结构: 线性表,还可细分为顺序表、链表、栈和队列; 树结构,包括普通树,二叉树,线索二叉树等; 图存储结构; 线性表 线性表结构存储的数据往往是可以依次排列的,就像小朋友手拉手,每位学生的前面和后面都仅有一个小朋友和他拉手,具备这种“
阅读全文
吴裕雄--天生自然数据结构:十大经典排序算法——基数排序
摘要:基数排序 基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。 1. 基数排序 vs 计数排序 vs 桶排序 基数排序有两种方法: 这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异: 基数排序:根据键值的每位数字来分配桶; 计数排序:每个...
阅读全文
吴裕雄--天生自然数据结构:十大经典排序算法——桶排序
摘要:桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点: 在额外空间充足的情况下,尽量增大桶的数量 使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中 同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。 什么时候最快 当输入的数据可以均匀的分配到每一个桶中。 什么时候最慢 当输入的数据被...
阅读全文
吴裕雄--天生自然数据结构:十大经典排序算法——计数排序
摘要:计数排序 计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。 1. 计数排序的特征 当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。 由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最
阅读全文
吴裕雄--天生自然数据结构:十大经典排序算法——堆排序
摘要:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法: 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列; 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列; 堆排序的
阅读全文
吴裕雄--天生自然数据结构:十大经典排序算法——快速排序
摘要:快速排序 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and conquer)策略来把一个串行(l...
阅读全文
吴裕雄--天生自然数据结构:十大经典排序算法——归并排序
摘要:归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法: 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法); 自下而上的迭代; 和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为...
阅读全文
吴裕雄--天生自然数据结构:十大经典排序算法——希尔排序
摘要:希尔排序 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率; 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位; 希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整...
阅读全文
吴裕雄--天生自然数据结构:十大经典排序算法——插入排序
摘要:插入排序 插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。 1. 算法步骤 将第一待排序序列第一个元素看做一个有序序列,把第...
阅读全文
吴裕雄--天生自然数据结构:十大经典排序算法——选择排序
摘要:选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。 1. 算法步骤 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 重复第二步,直到所有元素均排序完毕。 代码实现 JavaScript 代码实现 f
阅读全文