算法与数据结构
文章平均质量分 73
记录菜鸡慢慢学习算法的过程
尽量把每道题、每个算法都清楚的解释出来
Acwisher
这个作者很懒,什么都没留下…
展开
-
链表的两种创建方法——头插法与尾插法
链表创建的两种方法引言 首先讲述了我自己在动态实现数据结构的时候遇到的大坑结构体指针问题,随后就是头插法和尾插法的介绍。结构体指针引言 首先需要讲述的是一个让我改了一天半的bug。实际上半天的时候就已经发现了二级指针的问题,但是并没有深究,以为是自己对指针运用不够熟练,就略微重温了一下指针的比较浅层的相关内容,然后第二天的两个程序链栈和链队列都出现了段错误和垃圾值问题,改了半天才发现...原创 2020-03-12 23:17:29 · 6212 阅读 · 0 评论 -
基于链表两种建立方式的链栈与链表的实现
基于链表两种建立方式的链栈与链表的实现引言链栈代码和运行结果过程图片链式队列代码和运行结果过程图片总结引言基于上一篇博客讲述了链表建立的头插法和尾插法,所以这里先介绍链栈和链式队列,因为在头插法和尾插法的时候就分析了不同方法建立出来的数据的特点:一个逆序一个正序,基于这个特点来实现链栈和链式队列。链栈用链表的存储结构来实现栈的特点,栈有着先进后出的特点,元素只能栈顶入栈栈顶出栈,也就是说我...原创 2020-03-12 23:13:21 · 516 阅读 · 0 评论 -
排序算法(一)——初级排序算法
排序算法(一)——初级排序算法插入排序过程的图片展示插入排序顾名思义就是插入元素实现排序。如果通过插入元素实现排序呢,就是将无序部分的元素与有序部分的元素作比较确定当前元素应该插入的位置,当我们得到一个序列时,我们把第一个元素认为是序列的有序部分,把之后的2~n-1个元素通过元素大小比较(大于有序部分前一个元素且小于后面一个元素就是目标元素应该插入的位置,如果大于有序部分最后一个元素,那就可...原创 2020-03-13 17:29:44 · 228 阅读 · 0 评论 -
快速排序与归并排序
快速排序与归并排序进阶排序算法:快速排序与归并排序快速排序过程演示代码及其结果复杂度分析归并排序过程演示代码及其结果复杂度分析进阶排序算法:快速排序与归并排序快速排序过程演示快速排序利用的是递归的思想,递归每一次调用都将数组分成一个小于选定值的左子数组和大于选定值的右子数组,而选定值放置在左子数组和右子数组的过渡位置。再分别对左子数组和右子数组进行同样的快速排序。同时这里还利用了哨兵的思想...原创 2020-03-14 22:35:41 · 883 阅读 · 0 评论 -
二分查找及其变种问题
二分查找及其变种问题基本的二分查找代码实现非递归版本递归版本变种问题查找第一个等于给定值的元素过程描述代码实现查找最后一个等于给定值的元素过程描述代码实现查找第一个大于等于给定值的元素过程描述代码实现查找最后一个小于等于给定值的元素过程描述代码实现基本的二分查找代码实现非递归版本#include<stdio.h>int binary_search(int a[], int l...原创 2020-03-15 20:19:58 · 604 阅读 · 0 评论 -
链表(一)——基础操作
链表基础操作介绍链表是一种非常基础的数据结构,也很重要,也比较简单,所以就不多加赘述直接给出代码,这里采用的是尾接法建立链表,实现了增、删、查、遍历、求长度的功能代码实现及结果#include <stdio.h>#include <malloc.h>#include <stdbool.h>#include <windows.h>typ...原创 2020-03-18 11:18:20 · 163 阅读 · 0 评论 -
链表(二)——常见的进阶操作
链表(二)——常见的进阶操作引言这篇文章主要是讲单链表的一些常用的进阶操作,主要方法就是双指针,本文篇幅较长,在这里给出问题的索引,可以根据问题索引迅速定位自己需要看的内容(引申问题之后会找机会补充)有序链表的合并——>划分链表单链表反转——>链表相加求和寻找链表的倒数第k个节点——>旋转链表寻找链表的中间节点——>回文串判断链表中是否有环...原创 2020-03-18 11:30:42 · 300 阅读 · 0 评论 -
二叉树(一)——二叉树的建立与遍历
二叉树的先序建立与前中后序列遍历二叉树的数据结构typedef struct binary_tree{ int data; struct binary_tree *left,*right;} BT, *pBT;二叉树的先序建立过程思路二叉树的问题一般都是用递归来解决,我们就思考一下递归的过程从根节点开始思考,先建立根节点,然后建立左子树,然后建立右子树。根节...原创 2020-03-25 14:40:13 · 2290 阅读 · 0 评论 -
二叉树(二)——叶子节点数、节点数、深度、复制二叉树
二叉树遍历的应用二叉树的遍历有四个应用:求二叉树深度求二叉树所有节点求二叉树的叶子结点复制二叉树二叉树的深度深度:根节点到叶子节点的最长路径(边的个数)求二叉树的深度->左子树的深度与右子数的深度,最大的哪个int calculate_depth(pBT pB) //计算深度{ int m, n; if(pB==NULL) { ...原创 2020-03-25 14:42:34 · 1701 阅读 · 2 评论 -
二叉搜索树——插入、查找、删除
二叉搜索树二叉搜索树的特点根节点的值大于左结点的值,小于右结点的值根节点的左、右子树也是一个二叉搜索树没有重复值中序遍历得到的序列是从小到大排列的二叉树的存储结构typedef struct tree{ int data; struct tree *leftchild; struct tree *rightchild;} BiNod...原创 2020-03-26 12:26:30 · 805 阅读 · 0 评论 -
堆(一)——删除堆顶元素、插入元素、堆排序
堆的结构特点堆排序是一个可以高效实现排序的算法,复杂度是O(nlogn)和之前的快速排序与归并排序的复杂度相同,而它高效的排序依赖于它的结构特点堆是一个完全二叉树堆中每一个节点的值都必须大于等于(或者小于等于)其子树中每个结点的值第二点是说明每个节点都必须大于等于(或者小于等于)其左右子结点的值。其中大于等于其左右节点的堆叫大顶堆,小于等于其左右节点的堆叫小顶堆堆的存储结构分析由...原创 2020-03-26 12:28:20 · 13049 阅读 · 0 评论 -
堆(二)——TopK、中位数、优先级队列
堆的应用优先级队列介绍既然是优先级队列,那么就肯定具有之前学习的队列是具有先进先出的特点,但是优先级队列出队顺序并不是先进先出的,而是按照优先级来的,优先级最高的先出队。实现优先级队列的方法有很多,用堆来实现是最直接高效的。一个堆就可以看成一个优先队列。往优先队列里插入一个元素,相当于往堆里插入一个元素。从优先级队列中取出优先级最高的元素,就相当于取出堆顶元素有很多算法和数据结构都依赖于...原创 2020-03-26 12:31:31 · 335 阅读 · 0 评论