数据结构
故渊~
这个作者很懒,什么都没留下…
展开
-
搜索二叉树
查找 若根节点不为空: 如果根节点key==查找key 返回true 如果根节点key > 查找key 在其左子树查找 如果根节点key < 查找key 在其右子树查找 否则 返回false 插入 在二叉搜索树插入新元素时,必须先检测该元素是否在树中已经存在。如果已经存在,则不进行插入;否则将新元素插入到搜索停止的地方。 插入的具体过程: 1.树为空,则直接插入 如果是空树,直接插入,...原创 2018-09-19 16:00:38 · 174 阅读 · 0 评论 -
归并排序讲解及代码实现
基本思想 将待排序的元素序列分成两个长度相等的子序列,对每一个子序列排序,然后将他们合并成一个序列。合并两个子序列的过程称为二路归并 int array[] = {21, 25, 49, 25, 16, 8, 31, 41}; 代码实现 void _MergeSort(int *a, int left, int right, int *tmp) { if (left &gt;= righ...原创 2019-03-04 16:16:29 · 3771 阅读 · 2 评论 -
快速排序讲解及代码实现
基本思想 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。 代码实现 第一种方法:左右指针法 1.begin从最左边开始,end从最右边开始,用三数取中法设置...原创 2019-03-04 16:04:38 · 249 阅读 · 0 评论 -
冒泡排序讲解及代码实现
基本思想 思路:将相邻两个数进行比较然后交换,一趟冒泡可以将最大的数放在最后。 代码实现 void BubbleSort(int* array, size_t n) //冒泡排序 { int i, j = 0; int temp = 0; for (i = 0; i &lt; n; i++) { for (j = i + 1; j &lt; n; ...原创 2019-03-04 15:13:50 · 297 阅读 · 0 评论 -
堆排序讲解及代码实现
基本思想 创建堆:升序—&gt;大堆,降序—&gt;小堆 执行如下步骤,直到数组为空: 把堆顶array[0]元素和当前最堆的最后一个元素交换 堆元素个数减1 由于第1步后根节点不再满足最堆定义,向下调整根结点 代码实现 void HeapAdjustDown(int* array, size_t n,int parent) //向下调整 { int temp = 0; in...原创 2019-03-04 15:06:44 · 805 阅读 · 0 评论 -
直接选择排序讲解及代码实现
基本思想 每一趟(第i趟,i=0,1,…,n-2)在后面n-i个待排序的数据元素集合中选出关键码最小的数据元素,作为有序元素序列的第i个元素。待到第n-2趟做完,待排序元素集合中只剩下1个元素,排序结束。 在元素集合array[i]–array[n-1]中选择关键码最大(小)的数据元素 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换 在剩余的array...原创 2019-03-04 14:47:34 · 638 阅读 · 0 评论 -
希尔排序讲解及代码实现
基本思想 希尔排序可以理解为直接插入排序的优化 对于数据量大及数据逆序相对直接插入排序效率高:分为两步: 1.预排序:使数据接近有序,大的数据尽量向后移动,小的数据尽量向前移动 2.当gap=1时,即为直接插入排序,gap与数组大小有关 代码实现 void HillSort(int* array, size_t n) //希尔排序 { assert(array); int end...原创 2019-03-04 14:37:54 · 374 阅读 · 0 评论 -
常见排序算法讲解(代码实现、时间复杂度及稳定性)
排序 排序:就是将一组杂乱无章的数据按照一定的规律(升序或降序)组织起来。 排序码:通常数据元素有多个属性域可用来区分元素,作为排序依据,该域即为排序码。其中有一个属性域可用来区分元按照主排序码进行排序,排序的结果是唯一的。按照次排序码进行排序,排序的结果可能是不唯一的。 排序算法稳定性 如果在元素序列中有两个元素R[i]和R[j],它们的排序码K[i]== k[j],且在排序之前,元素R[i]在...原创 2019-03-04 13:25:25 · 277 阅读 · 0 评论 -
直接插入排序讲解及代码实现
基本思想 每一步将一个待排序的元素,按其排序码的大小,插入到前面已经排好序的一组元素的合适位置上去,直到元素全部插完为止。 当插入第i(i&amp;gt;=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后...原创 2019-03-04 13:17:57 · 13153 阅读 · 4 评论 -
二叉树的各种遍历详解--递归/非递归代码实现
二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次 ,且仅被访问一次。 二叉树的遍历方式常用的有四种:前序遍历、中序遍历、后序遍历和层序遍历。 前序遍历 前序遍历:简单来说就是:根->左->右。 规则:若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。 递归实现: //先序遍历,递归法 void PrevO...原创 2019-04-21 17:57:30 · 448 阅读 · 1 评论