
数据结构
Dandelion_2
这个作者很懒,什么都没留下…
展开
-
动态规划 0-1背包问题
#include<iostream>#include<vector>#include<algorithm>using namespace std;int backpack(int* w, int* v, int W, int nums) { vector<vector<int>>res(nums+1, vector<int>(W+1, 0)); for (int i = 1; i <= nums; i++) {原创 2020-08-16 21:14:30 · 140 阅读 · 0 评论 -
力扣 64
一共考虑四种情况:上和左都是边界,即起点;上是边界;左是边界;上左都不是边界class Solution {public: int minPathSum(vector<vector<int>>& grid){ if(grid.size() == 0){ return 0; } int m = grid.size(); int n = grid[0].size(); .原创 2020-08-14 14:22:09 · 188 阅读 · 0 评论 -
9.基数排序
算法思想基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。算法描述1.取得数组中的最大数,并取得位数;2.arr为原始数组,从最低位开始取每个位组成radix数组;3.对radix进行计数排序(利用计数排序适用于小范围数的特点);算法实现C++...原创 2020-08-06 23:41:12 · 183 阅读 · 0 评论 -
8.计数排序
算法思想计数排序是一种特殊情况下的一种排序:量大但是范围小比如:如何快速得知高考名次计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。算法描述找出待排序的数组中最大和最小的元素;统计数组中每个值为i的元素出现的次数,存入数组C的第i项;对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(原创 2020-08-05 13:34:50 · 141 阅读 · 0 评论 -
7.堆排序
算法思想堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。算法描述1.将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;2.将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];3.由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无原创 2020-08-02 19:03:02 · 305 阅读 · 0 评论 -
6.归并排序
算法思想归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并算法描述1.把长度为n的输入序列分成两个长度为n/2的子序列;2.对这两个子序列分别采用归并排序;3.将两个排序好的子序列合并成一个最终的排序序列。...原创 2020-07-29 23:37:52 · 360 阅读 · 0 评论 -
5.希尔排序
算法思想希尔排序是希尔(Donald Shell) 于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。希尔排序是把记录按下表的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。算法描述我们来看下希尔排序的基本步骤原创 2020-07-29 14:49:33 · 323 阅读 · 0 评论 -
4.插入排序
算法思想插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。算法描述一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:1.从第一个元素开始,该元素可以认为已经被排序;2.取出下一个元素,在已经排序的元素序列中从后向前扫描;3.如果该元素(已排序)大于新元素,将该元素移到下一位置;4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;5.将新元素原创 2020-07-28 21:57:51 · 320 阅读 · 0 评论 -
3.快速排序
算法思想快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。算法描述快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:1.从数列中挑出一个元素,称为 “基准”(pivot);2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。3…在这个分区退出之后,该基准就处于数列的中间位置。这个称原创 2020-07-28 21:10:47 · 279 阅读 · 0 评论 -
2.选择排序
选择排序思想选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。算法描述n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:1.初始状态:无序区为R[1…n],有序区为空;2.第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R(i…n原创 2020-07-27 22:27:40 · 170 阅读 · 0 评论 -
十大排序算法总结
排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:关于时间复杂度平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序;O(n1+§))原创 2020-07-25 13:37:55 · 160 阅读 · 0 评论 -
郝斌老师【数据结构入门】之快速排序
#include<stdio.h>void QuickSort(int *, int, int);int FindPos(int *, int, int);//主要思想:通过移动和赋值的方式确定第一个元素的最终位置,然后在用同样的方法分别确定第一个元素的最终位置的左边一部分和右边一部分的第一个元素的最终位置,以此类推int main(void){ int a[6] = { 2,1,0,5,4,3 }; int i; for (i = 0; i < 6; ++i)原创 2020-07-15 21:37:42 · 215 阅读 · 0 评论 -
郝斌老师【数据结构入门】之二叉树程序演示
需要创建的二叉树如图:#include<stdio.h>#include<malloc.h>struct BTNode{ char data; struct BTNode * pLchild; struct BTNode * pRchild;};struct BTNode * CreateBTree(void);void PreTraverseBTree(struct BTNode *);void InTraverseBTree(struct BTNod原创 2020-07-13 22:16:00 · 314 阅读 · 0 评论 -
郝斌老师【数据结构入门】之树
非线性结构树树定义:专业定义:1.有且成为根的结点2.有若干互不相交的子树,这些子树本身也是一颗树通俗定义:1.树是由结点和边组成2.每个结点只有一个父结点但可以有多个子结点3.但有一个结点例外,该借点没有父结点,此结点为根结点专业术语:结点 父结点 子结点子孙 堂兄弟深度:从根结点到最底层结点的层数称之为深度,根结点为第一层叶子结点:没有子结点的结点非终端结点:实际是非叶子结点度:子结点的个数成为度树的分类一般树:任意一个结点的子结点的个原创 2020-07-07 22:16:07 · 242 阅读 · 0 评论 -
郝斌老师【数据结构入门】之汉诺塔
#include<stdio.h>void hannuota(int n, char A, char B, char C){ //如果是一个盘子,直接将A柱子上的盘子移到C //否则 //先将A柱子上的n-1个盘子借助C移到B //直接将A柱子上的盘子从A移到C //最后将B柱子上的n-1个盘子借助A移到C if (n == 1) { printf("将编号为%d的盘子直接从%c柱子移到%c\n", n, A, C); } else { hannuota(n原创 2020-07-07 20:37:26 · 248 阅读 · 0 评论 -
郝斌老师【数据结构入门】之递归
定义一个函数自己直接或间接调用自己递归满足三个条件1、递归必须得有一个明确的终止条件2、该函数所处理的数据规模必须在递减3.、这个转化必须是可解的循环和递归递归:易于理解速度慢存储空间大循环不易理解速度快存储空间小...原创 2020-07-06 22:24:59 · 255 阅读 · 0 评论 -
郝斌老师【数据结构入门】之队列程序演示
#include<stdio.h>#include<malloc.h>typedef struct Queue{ int * pBase; int front; int rear;}QUEUE;void init(QUEUE *);//入队bool en_queue(QUEUE *, int);//遍历void traverse(QUEUE *);bool full_queue(QUEUE*);bool empty_queue(QUEUE *原创 2020-07-02 22:30:35 · 207 阅读 · 0 评论 -
郝斌老师【数据结构入门】之队列
线性结构的两种常见应用之二定义一种可以实现“先进先出”的存储结构分类链式队列 --用链表实现静态队列 --用数组实现静态队列通常都必须是循环队列循环队列:1.静态队列为什么必须是循环队列2.循环队列需要几个参数来确定需要两个参数确定frontrear3.循环队列各个参数的含义2个参数不同场合有不同含义建议初学者先记住,然后慢体会1)队列初始化front和rear的值都是零2)队列非空front代表的是队列的第一个元素rear代表的是队列的最后一个有效元素的下一个元原创 2020-06-30 22:34:35 · 270 阅读 · 0 评论 -
郝斌老师【数据结构入门】之栈的程序演示
#include<stdio.h>#include<malloc.h>#include<stdlib.h>//生成节点typedef struct Node{ int data; struct Node *pNext;}NODE, *PNODE;//定义栈typedef struct Stack{ PNODE pTop; PNODE pBottom;}STACK, *PSTACK;//初始化栈void init(PSTACK);原创 2020-06-29 20:36:21 · 1751 阅读 · 0 评论 -
郝斌老师【数据结构入门】之栈
线性结构的两种常见应用之一 栈定义一种可以实现“先进后出”的的存储结构栈类似于箱子分类静态栈动态栈(主要是动态栈)算法压栈出栈应用原创 2020-06-29 20:31:56 · 186 阅读 · 0 评论 -
郝斌老师【数据结构入门】学习记录之链表复习
数据结构狭义:数据结构是专门研究数据存储的问题数据的存储包含两个方面:个体的存储,个体关系的存储广义:数据结构既包含数据的存储也包含数据的操作对存储数据的操作就是算法算法狭义:狭义的算法与数据的存储方式密切相关广义的算法与数据存储的方式无关泛型:利用某种技术达到的效果就是:不同的存储方式,执行的操作一样的。数据的存储方式有几种线性连续存储【数组】优点:存取速度很快缺点:事先必须知道数组的长度插入和删除元素很慢空间通常是有限的需要大块连续的内存块离散存储【链表】原创 2020-06-16 21:43:07 · 197 阅读 · 0 评论 -
郝斌老师【数据结构入门】学习记录之链表
链表的定义:线性结构【把所有的节点用一根直线穿起来】连续存续[数组]1.什么叫数组元素类型相同,大小相等2.数组的优缺点:离散存储[链表]定义:n个结点离散分配;彼此通过指针相连;每个节点只有一个前驱节点,每个节点只有一个后续结点;首节点没有前驱结点,尾节点没有后续结点。专业术语:首结点:第一个有效结点。尾结点:最后一个有效结点。头结点:第一个有效结点之前的那个结点,头结点并不存放有效数据,加头结点的目的主要是为了方便对链表的操作。头指针:指向头结点的指针变量。尾指针:指向原创 2020-06-13 21:55:38 · 318 阅读 · 0 评论