数据结构与算法
文章平均质量分 50
对数据结构和算法的学习
欧麦噶没有昵称
学习使我快乐
展开
-
折半插入排序
折半插入排序插入类排序就是在一个有序的序列中,插入一个新的关键字,直到所有的关键字都插入形成一个有序的序列。插入类排序还包括折半插入排序和希尔排序折半插入排序将比较和移动这两个操作分离出来,也就是先利用折半查找找到插入的位置,然后一次性移动元素,再插入该元素。排序过程 下标 1 2 3 ...原创 2019-07-23 21:19:10 · 704 阅读 · 0 评论 -
排序
排序排序的基本内容 插入排序 直接插入排序 折半插入排序 希尔排序 交换排序 冒泡排序 快速排序 选择排序 简单选择排序 堆排序 2路归并排序 基数排序 外部排序 各种排序算法的比较及应用 内部排序算法的比较及应用 外部排序 ...原创 2019-07-23 07:05:21 · 161 阅读 · 0 评论 -
希尔排序
希尔排序希尔排序又称为缩小增量排序希尔排序的基本思想:希尔排序本质上还是插入排序,只不过是把待排序序列分成几个子序列,再分别对这几个子序列进行直接插入排序。排序过程①先以增量5来分割序列,也就是下标为0,5,10,15...的关键字分成一组,下标为1,6,11,16..分成一组,然后对这些组分别进行直接插入排序,这就完成了一轮希尔排序。②缩小增量(d1=n/2,di+1= d...原创 2019-07-23 21:33:59 · 279 阅读 · 0 评论 -
直接插入排序
直接插入排序(Straight Insertion Sort)算法思想是:把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。#include <stdio.h>#define MAXSIZE 8t...原创 2019-07-23 01:34:43 · 196 阅读 · 0 评论 -
排序的基本内容
排序的定义排序:重新排列表中的元素,使表中的元素满足按关键字递增或递减的过程。 输入:n个记录R1,R2,...Rn,对应的关键字有k1,k2,...kn 输出:输入序列的一个重排R11,R22,...Rnn,使得有k11 <= k22 <= ... knn 算法的稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原...原创 2019-07-23 00:32:14 · 232 阅读 · 0 评论 -
KMP算法
KMP算法 自我感觉KMP算法一开始学起来有点绕,但是经过各种百度网上查阅材料,现在才对其有了一个更好的认识,为了加深 自己对其的理解,特地写下该文...下面让我们探讨一下几个问题:1.什么是KMP算法? KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫 里斯—普拉特操作(简称KMP算法)。...原创 2019-07-22 00:33:05 · 131 阅读 · 0 评论 -
B树/B+树
一、为什么要有B树? 学习任何一个东西我们都要知道为什么要有它,B树也一样,既然存储数据,我们为什么不用红黑树呢? 这个要从几个方面来说了:(1)计算机有一个局部性原理,就是说,当一个数据被用到时,其附近的数据也通常会马上被使用。(2)所以当你用红黑树的时候,你一次只能得到一个键值的信息,而用B树,可以得到最多M-1个键值的信息。这样来说B树当然更好了。(3)另外一方面,同...转载 2019-07-18 21:25:51 · 129 阅读 · 0 评论 -
线性索引查找
索引索引就是把一个关键字与它对应的记录相关联的过程,一个索引由若干个索引项构成,每个索引项至少应包含关键字和其对应的记录在存储器中的位置等信息。索引技术是组织大型数据库以及磁盘文件的一种重要技术。索引的分类索引按照结构可以分为线性索引、树形索引和多级索引。所谓的线性索引就是将索引项集合组织为线性结构,也称为索引表。主要有以下三种线性索引:稠密索引、分块索引、倒排索引。稠密索引稠...原创 2019-07-18 00:50:32 · 212 阅读 · 0 评论 -
折半查找
折半查找折半查找技术(Binary Search),又称二分查找。它的前提是线性表中的记录必须是关键码有序(通常由小到大),线性表必须采用顺序存储。折半查找的基本思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在左半区继续查找;若给定值大于中间记录的关键字,则在右半区继续查找。不断重复上述过程,直到查找成功,或查询区域无记...原创 2019-07-17 23:48:10 · 334 阅读 · 0 评论 -
顺序查找
顺序查找顺序查找又叫线性查找,是最基本的查找技术,他的查找过程是:从表中第一个(或者最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,者查找成功,找到所查的记录;如果直到最后一个(或者第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找不成功。顺序表查找算法/*顺序查找,a为数组,n为要查找的数组长度,key为要查找的关键字*/...原创 2019-07-17 22:48:05 · 7386 阅读 · 1 评论 -
拓扑排序
拓扑排序介绍拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列。这样说,可能理解起来比较抽象。下面通过简单的例子进行说明!例如,一个项目包括A、B、C、D四个子部分来完成,并且A依赖于B和D,C依赖于D。现在要制定一个计划,写出A、B、C、D的执行顺序。这时,就可以利用到...转载 2019-07-17 01:21:01 · 121 阅读 · 0 评论 -
图的理论基础
图的基本概念1. 图的定义定义:图(graph)是由一些点(vertex)和这些点之间的连线(edge)所组成的;其中,点通常被成为"顶点(vertex)",而点与点之间的连线则被成为"边或弧"(edege)。通常记为,G=(V,E)。2. 图的种类根据边是否有方向,将图可以划分为:无向图和有向图。2.1 无向图上面的图G0是无向图,无向图的所有的边都是不区分方向的。G...转载 2019-07-16 13:27:55 · 225 阅读 · 0 评论 -
Kruskal算法
最小生成树在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树。例如,对于如上图G4所示的连通网可以有多棵权值总和不相同的生成树。克鲁斯卡尔算法介绍克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边...转载 2019-07-19 01:13:09 · 183 阅读 · 0 评论 -
迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法介绍是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止基本思想通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。 此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还...转载 2019-07-16 01:16:30 · 423 阅读 · 0 评论 -
Floyd算法
弗洛伊德算法介绍和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。基本思想 通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离...转载 2019-07-16 01:33:09 · 132 阅读 · 0 评论 -
Prim算法(邻接矩阵实现)
普里姆算法介绍普里姆(Prim)算法,和克鲁斯卡尔算法一样,是用来求加权连通图的最小生成树的算法。基本思想对于图G而言,V是所有顶点的集合;现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放G的最小生成树中的边。 从所有uЄU,vЄ(V-U) (V-U表示出去U的所有顶点)的边中选取权值最小的边(u, v),将顶点v加入集合U中,将边(u, v)加入集合T中,如...转载 2019-07-14 01:25:23 · 6760 阅读 · 2 评论 -
Prim算法(邻接表实现)
/** * C: prim算法生成最小生成树(邻接表) * */#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <string.h>#define MAX 100#define INF (~(0x1<<...转载 2019-07-14 01:28:10 · 4672 阅读 · 1 评论 -
约瑟夫环(Josephus)问题
约瑟夫环(Josephus)问题是由古罗马的史学家 约瑟夫(Josephus)提出的。问题描述为: 编号为1, 2,…,n的n个人按顺时针方向围坐在一张圆桌周围, 每人持有一个密码(正整数)。一开始任选一个正整数 作为报数上限值m,从第一个人开始按顺时针方向自1 开始报数,报到m时停止报数,报m的那个人出列,将 他的密码作为新的m值,从他顺时针方向的下一个人开 始重新从1报数,数到m的那个人又出列...翻译 2018-07-23 21:16:25 · 1806 阅读 · 0 评论 -
循环链表(Circular Linked List)
单向循环链表和普通的链表结构不同,单向循环链表的最后一个节点的指针指向了头结点,也就是和Head指针有相同的引用和普通链表相比,循环链表不需要头指针,能够从任意位置实现链表遍历 双向循环链表和单向链表相比,双向链表多了一个指向上一个节点的前向指针相比于单向链表,双向循环链表的遍历更加灵活,但缺点是,进行插入和删除操作需要修改更多的指针 队列的“假溢出...翻译 2018-07-23 21:19:55 · 1205 阅读 · 0 评论 -
双端栈
两栈共享技术 ——双端栈 主要利用了栈“栈底位置不变,而栈顶位置动态变化” 的特性。首先为两个栈申请一个共享的一维数组空间 S[M],将两个栈的栈底分别放在一维数组的两端,分 别是0,M-1。两栈共享数据结构定义:#define M 100typedef struct{ StackElementType Stack[M]; StackElementType top[2];...原创 2018-07-24 20:40:55 · 2928 阅读 · 0 评论 -
栈的应用之汉诺塔问题
栈的应用:嵌套及递归的实现1、递归定义 :在定义自身的同时又出现了对自身的调用。 直接递归函数:如果一个函数在其定义体内直接调用自己,则称直接递归函数。 间接递归函数:如果一个函数经过一系列的中间调用语句,通过其它函数间接调用自己,则 称间接递归函数。2.递归应用实例例:递归方法求n的阶乘递归算法的两个基本特征:1、递推归纳 将问题...原创 2018-07-24 21:50:14 · 724 阅读 · 0 评论 -
数据结构(c语言)--栈的学习
定义:作为一种限定性线性表,是将线性表的 插入和删除运算限制为仅在表的一端进行。 表中允许进行插入、删除操作的一端称为 栈顶 (Top),表的另一端被称为栈底 (Bottom)。当栈中没有元素时称为空栈。 栈的插入操作称为进栈或入栈。 栈的删除操作称为出栈或退栈。特点:后进先出(LIFO) 栈主要包括两种:① 顺序栈 用顺序存储结构实现的栈,即利用一组地址 连续的存储单元依...原创 2018-07-24 17:28:32 · 354 阅读 · 0 评论 -
队列(c语言)
队列:限定所有的插入操作在表的一端进行,而 删除操作在表的另一端进行的线性表。允许进行插入操作的一端称为队尾 (rear),允许进行删除操作的一端称为队头(front)1.队列类型的定义#define MAX 50typedef struct{ ElemType data[MAX]; int front,rear;//front为队首指针 re...原创 2018-07-26 14:09:47 · 2721 阅读 · 0 评论 -
串(c语言)
串的定义 :串是由零个或多个字符组成的有限序列。S= ‘a1a2…an-1an ’ (n≥0)子串: 串中任意个连续的字符组成的子序列。主串:包含子串的串相应地称为主串。位置:字符在序列中的序号。子串在主串中的位置则以子串的第一个字符在主串中的位置来表示。相等:两个串的长度相等,并且对应位置的字符都相等。 串的抽象数据类型的定义串的模式匹配...原创 2018-07-27 16:52:24 · 2940 阅读 · 0 评论 -
线索二叉树
基本概念:指向遍历序列前驱、后继结点的指针称为线索; 含有线索的二叉链表称为线索链表; 把空指针修改为线索的过程称为线索化; 经过线索化的二叉树称为线索二叉树。 一、线索二叉树的结点结构二、线索二叉树的遍历1、访问遍历的第一个结点 ;2、寻找并访问当前结点的后继结点。重复执行步骤2,直至所有结点被访问。 三、线索二叉树分为 先序线索二叉树 中...原创 2018-08-02 11:11:24 · 215 阅读 · 0 评论 -
王道P19 12题
已知一个整数序列A=(a0,a1,…,an-1),其中0≤ai<n(0≤i<n)。若存在ap1=ap2=…=apm=x且m>n/2(0≤pk<n,1≤k≤m),则称x为A的主元素。例如A=(0,5,5,3,5,7,5,5),则5为主元素;又如A=(0,5,5,3,5,1,5,7),则A中没有主元素。假设A中的n个元素保存在一个一维数组中,请设计一个尽可能高效的算法,找出A的主元素。若存在主元素,则...原创 2019-05-06 01:41:46 · 901 阅读 · 0 评论 -
两数相加 方法:初等数学
题目:算法就像你在纸上计算两个数字的和那样,我们首先从最低有效位也就是列表l1l1和l2l2的表头开始相加。由于每位数字都应当处于0 \ldots 90…9的范围内,我们计算两个数字的和时可能会出现 “溢出”。例如,5 + 7 = 125+7=12。在这种情况下,我们会将当前位的数值设置为22,并将进位carry = 1carry=1带入下一次迭代。...原创 2019-05-17 02:49:43 · 670 阅读 · 0 评论 -
并查集
#include <stdio.h>#include<stdlib.h>#define VERTICES 6void initialise(int parent[]){ int i; for ( i = 0; i < VERTICES; i++ ){ parent[i] = -1; }}int find_root(int x , int ...原创 2019-07-08 19:55:24 · 109 阅读 · 0 评论 -
codeup1819
/*题目描述 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。输入 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符, 整数和运算符之间用一个空格分隔。没有非法表达式。 当一行中只有0时输入结束,相应的结果不要输出。输出 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。样例输入 30 / 90 - 26 + 9...原创 2019-08-29 17:26:19 · 174 阅读 · 0 评论 -
PAT A1020
#include<cstdio>#include<cstring>#include<queue> #include<algorithm>using namespace std;const int maxn=50;struct node{ int data; node* lchild; node* rchild;};int pr...原创 2019-08-31 20:53:01 · 156 阅读 · 0 评论 -
八皇后问题(递归求解)
实现代码#include<cstdio>int count=0;int notDanger(int row,int j,int (*chess)[8]){ //判断列方向 int i,k,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0; for(i=0;i<8;i++){ if (*(*(chess+i)+j)!=0){ ...原创 2019-09-15 02:07:54 · 113 阅读 · 0 评论 -
马踏棋盘
源码:/*题目渊源: 马踏棋盘问题(又称骑士周游或骑士漫游问题)是算法设计的经典问题之一。题目要求: 国际象棋的棋盘为8*8的方格棋盘,现将马放在任意指定的方格中按照马走棋的规则将马进行移动。 要求每个方格只能进入一次,最终使得马走遍棋盘64个方格。 编写代码, 实现马踏棋盘的操作,要求用1~64来标注马移动的路径 回溯法: 指导思想很简单,就是一条路走到黑,碰壁...原创 2019-09-16 01:35:46 · 362 阅读 · 0 评论