![](https://img-blog.csdnimg.cn/20190929170750891.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构和算法
数据结构和算法太重要,工作两年多,深深体会到其解决实际项目的重要性,故重拾数据结构和算法,希望算法虐我千万遍,我待算法如初恋。不求研制新算法,但求能运用自如目前主流算法去解决实际问题,贵在坚持,加油-2019.9.29.
钱叁壹
拼搏到无能为力,努力到感动自己!
展开
-
查找算法-二分查找
二分查找算法(Binary Search Algorithm),又称折半查找算法(Half-Interval Search Algorithm),是一种在有序数组中查找某一特定元素的搜索算法。该算法每次比较中间元素的值与查找值,如果中间元素的值大于查找值,则在数组的左半部分继续查找;如果中间元素的值小于查找值,则在数组的右半部分继续查找,直到找到为止。二分查找法是一种高效的搜索算法,时间复杂度为 O(log n)。但是,在最坏情况下,二分查找可能需要查找 n 次,其中 n 表示数组的长度。原创 2023-06-06 22:35:15 · 698 阅读 · 0 评论 -
非递归遍历二叉树实现
一、递归 1.借助栈,实现3种遍历的非递归算法。 2.层次遍历是自顶向下、自左至右的遍历二叉树中的元素,可以借助队列实现。二、具体实现#include<stdio.h>#include<stdlib.h>#include<stack>#include<queue>using namespace std;typedef c原创 2020-06-29 00:14:06 · 907 阅读 · 0 评论 -
递归实现二叉树的创建和遍历
一、定义 二叉树是一种树形结构,他的特点是每个节点之多只有两颗子树,并且二叉树有左右之分,其次不能任意点到。二、性质1、性质1 二叉树的第i层上最多有2 i-1个结点(i>=1)。性质2 在一棵深度为k的二叉树中,最多有2^k-1个结点,最少有k个结点。性质3 在一棵二叉树中,如果叶子结点的个数为n0,原创 2020-06-23 19:21:09 · 777 阅读 · 0 评论 -
归并排序详解
//归并排序-递归实现void merge(ElementType SR[],ElementType TR[],int s,int m,int n){ int i,j,k; for(k = i = s,j = m + 1; i <= m && j <= n;k++){ if(SR[i] <= SR[j]){ TR[k] = SR[i++]; }else{ TR[k] = SR[j++]; } } while(i <= m原创 2020-06-13 22:45:33 · 135 阅读 · 0 评论 -
选择排序-堆排序
一、定义 完全二叉树中所有非终端节点的值均不大于(或不小于)其左、右孩子节点的值称为堆。若在输出堆顶的最小或最大元素后,使得剩余n-1个元素的序列又建成一个堆,则得到n个元素中的次小值或次大值,这样反复执行,遍得到一个序列,这样的过程称为堆排序。堆排序最坏情况下,其时间复杂度为O(nlogn);二、实现 堆排序需要解决两个问题:(1)如何由一个无序的序列建成一个堆。(2)如何在输出顶点元素后,调整剩余元素称为原创 2020-06-05 11:01:38 · 183 阅读 · 0 评论 -
选择排序-简单选择排序
一、定义 每一趟排序在n - i - 1个记录中选择一个关键字最小的记录作为序列中的第i个记录。一趟排序是通过n - i - 1次关键字的比较,从n - i - 1个记录中选择一个最小的记录,并和第i个记录交换。二、实现/*选择排序: 从头至尾扫描序列,找出最小的一个元素,和第n - i - 1个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列。算法复杂度 0(n^2),稳定的算法*/void selectSor原创 2020-06-04 10:24:34 · 213 阅读 · 0 评论 -
交换排序-快速排序
一、定义 快速排序是对起泡排序的一种改进。它通过一趟排序将待排序的记录分割成独立的两个部分,其中一部分的记录比另一个部分记录的关键字小,则在对这两部分记录继续排序,以达到整个序列有序。 具体做法是,选取一个点作为枢轴或支点,经过一趟排序,将序列分为比枢轴小的一部分和比枢轴大的一部分,然后在继续递归。即设两个指针low和high分别指向序列的开始和结束位置,pivotkey记录枢轴(一般将list[ low ] 作原创 2020-06-04 10:12:16 · 226 阅读 · 0 评论 -
交换排序-起泡排序
一、定义 首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(即L.r[1].key > L.r[2].key),则将两个记录交换之,然后比较第二个记录和第三个记录的关键字。依次类推,直至第n-1个记录和第n个记录的关键字进行过比较为止。上述过程称为一次起泡排序,其结果是使得关键字最大的记录被安置到最后一个记录的位置上。然后进行第二趟起泡排序,直至n - 1趟为止就完成了整个起泡排序过程。二、实现 &nb原创 2020-06-03 09:50:45 · 144 阅读 · 0 评论 -
插入排序-希尔排序
希尔排序一、定义 希尔排序又称缩小增量排序,它也是一种插入排序类方法,但在时间效率较前几种有较大的的改进。二、具体实现 先将整个待排记录序列分割成若干个子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。在这里插入代码片三、分析 希尔排序的分析是个复杂的问题,因为的时间是所取“增量序列的原创 2020-05-25 22:59:47 · 326 阅读 · 0 评论 -
插入排序-2-路插入排序
2-路插入排序 一、定义 2-路插入排序是在折半插入排序的基础上再改进,其目的是减少排序过程中移动记录的次数,但为此要付出n个记录的辅助空间。二、具体实现 另设一个同类型的数组d,先将list[1]复制给d[1],并将d[1]看成是排好序的序列中处于中间位置的记录,然后从list中第二个记录起依次插入到d[1]之前或之后的有序序列中。先将待插入记录和d[1]进行比较,若大于d[1],则原创 2020-05-24 13:42:07 · 1263 阅读 · 0 评论 -
插入排序-折半插入排序
折半插入排序一、定义 由于插入排序的基本操作是在一个有序表中进行查找和插入,那对于在有序表中查找新记录的插入位置就可以使用二分查找来实现,此时进行的插入排序叫折半插入排序。二、实现 使用两个指针low、high分别指向有序表的开始和结束,求取中间位置mid = (low+ high)/ 2,然后比较待插入记录,若其大于list[mid],则插入位置在[low,mid - 1]区间,反之,则在[low + 1,原创 2020-05-17 23:07:25 · 209 阅读 · 0 评论 -
插入排序-直接插入排序
直接插入排序一、定义 直接插入排序是最简单的排序方法,它的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录增1的有序表。二、具体实现 整个排序过程为进行n - 1趟插入,即先将序列中的第一个记录看成是一个有序的子序列,然后从第二个记录开始逐个进行插入,直至整个序列变成按关键字非递减有序为止。 从空间来看,它只需要一个记录辅助空间,从时间来看,排序的基本操作为:比较两个关键字的大小和移动记录。直接插入排序是稳定排原创 2020-05-16 22:31:12 · 578 阅读 · 0 评论 -
栈
一、概念 栈是限定仅在表尾进行插入或删除操作的线性表。表尾端称为栈顶,表头端成为栈底,栈的一大特点是先进后出。二、顺序栈的实现 和线性表一样,栈也有两种存储方式,这里实现顺序栈。1.栈结构typedef struct{ SElemType *base; SElemType *top; int stacksize;}2.具体实现(1)栈空:s.top == ...原创 2019-10-22 23:24:27 · 238 阅读 · 1 评论 -
双向链表
一、概念 由于单链表从某个节点出发只能顺着指针往后查询其他结点。若要找寻节点的直接前驱,则需从表头指针开始查找,即查找下一个节点的时间复杂度为0(1),查找上一个节点时间复杂度为0(n),所以为克服单链表的这一缺点,我们可以创建双向链表。二、实现1.存储结构typedef DULNODE{ ElemType data; struct DULNODE *prior; struct D...原创 2019-10-21 22:00:51 · 179 阅读 · 0 评论 -
顺序表的链式实现-单链表
一、线性链表 逻辑上相邻的两个元素在物理存储单元上不一定是不相邻的,这就是链表。二、单链表具体实现头文件:#include<stdio.h>#include<stdlib.h>#include<Windows.h>typedef int ElemType;typedef struct LNode{ ElemType data; LNode...原创 2019-10-16 23:33:41 · 410 阅读 · 0 评论 -
线性列表的顺序实现
一、线性列表的特点(1)存在唯一的一个被称作“第一个”的数据元素。(2)存在唯一的一个被称作“最后一个”的数据元素。(3)除第一个外,集合中的每一个数据元素均只有一个前驱。(4)除最后一个外,集合中每一个数据元素均只有一个后续。二、线性表的顺序实现 线性表的顺序实现是指用一组地址连续的存储单元依次存储线性表的数据元素。元素的存储位置满足以下关系: LOC(ai+1) = L...原创 2019-09-29 17:21:11 · 183 阅读 · 0 评论