![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
Chpchen0304
这个作者很懒,什么都没留下…
展开
-
数据结构
数据结构前言顺序表前言时光不负有心人,星光不问赶路人。心血来潮,想实现一遍数据结构的算法。努力做好这件事吧,在csdn做个记录这是第三次实现数据结构算法,每实现一次感受都不一样,侧重点也不一样但每次都受益匪浅前两次都是面向过程的实现,这次挑战一下,以面向对象的方法实现,也算给自己建一个算法类库吧!!!顺序表/*chp更新时间:2020/12/4 22:19持续更新*/#include <iostream>#include <algorithm>原创 2020-12-04 22:46:32 · 314 阅读 · 0 评论 -
归并排序
归并排序什么是归并排序归并排序是将两个或者两个以上的有序表合并成一个有序表的过程。归并排序的算法思想假设初始序列含有n个记录,则可以看成n个有序的序列,每个子序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,如此重复,直至得到一个长度n的有序序列为止。图例代码实现 #include<iostream> using ...原创 2020-02-24 12:50:38 · 191 阅读 · 0 评论 -
堆排序
堆排序什么是堆排序堆排序是一种树形选择排序,在排序过程中,将待排序的记录r[1…n]看成是一颗完全二叉树的顺序储存结构,利用完全二叉树中的双亲结点和孩子节点之间的内在联系,在当前无序的序列中选择关键字最大或者最小的记录。堆的定义n个元素的序列{k1,k2,k3,k4…ki}称之为堆,当且仅且满足一下条件时:(1)(ki>=k2i)且(ki>=k2i+1)(2) (k...原创 2020-02-23 15:03:22 · 234 阅读 · 0 评论 -
简单选择排序
简单选择排序什么是简单选择排序简单选择排序也称作直接选择排序,也是我们最常用到的排序方法。从第一个元素开始与后面的元素比较,如果第一个元素大于后面的元素,就两个进行交换。简单选择排序的算法步骤(1)设待排序的记录存放在数组r[1…n]中。从第一趟r[1]开始,通过n-1次比较,从N个记录中选出关键字最小的记录,记在r[k],交换了r[1] r[k].(2) 以此类推,第i趟从r[...原创 2020-02-23 12:26:31 · 399 阅读 · 0 评论 -
快速排序
快速排序什么是快速排序快速排序是由冒泡排序改进而得的。在冒泡排序过程中,只对相邻的两个记录进行交换,因此每次交换两个相邻记录只能消除一个逆序。而快速排序可以一次交换消除多个逆序。快速排序的思想是在未排序的序列中,选择一个枢纽(一般是表的第一个元素),一次排序之后,把表分成两个子序列,比枢纽记录关键字小的记录在枢纽的左面,比其大的在右面,然后再对两个子表进行快速排序,直至每一个子表只剩一个记...原创 2020-02-22 15:15:15 · 187 阅读 · 0 评论 -
冒泡排序
冒泡排序什么是冒泡排序冒泡排序是一种最简单的交换排序方法,它通过两两比较相邻记录的关键字,如果发生逆序,则进行交换,从而使关键字小的记录如气泡一样上浮,关键字大的像石头一样下沉。冒泡排序的算法步骤(1) 设待排序的记录存放在数组r[1…n]中。首先将第一个记录和第二个记录的关键字进行比较,若为逆序,则交换两个记录。然后比较第二个记录和第三个记录的关键字。以此类推,直至第n-1个记录...原创 2020-02-22 12:32:01 · 286 阅读 · 0 评论 -
希尔排序
希尔排序什么是希尔排序希尔排序是插入排序的一种。希尔排序实质上是采用分组插入的方法。先将整个待排序列记录分成几组,从而减少参与直接插入排序的数据量,对每组记录分别进行直接插入排序,然后增加每组的数据量,重新分组。这样当经过几次分组排序后,整个序列的记录基本有序时,在对全体记录进行依次直接插入排序。希尔排序算法步骤希尔排序的分组,不是简单的“逐段分割”,而是将相隔某个”增量“的记录分...原创 2020-02-22 11:58:54 · 192 阅读 · 0 评论 -
折半插入排序
折半插入排序-什么是折半插入排序折半插入排序就是在直接插入排序的基础上,修改了“查找”操作的算法,使用折半查找操作,使得排序效率得到提升。折半插入排序的算法步骤(1)设待排序的记录放在数组r[1…n]中,r[1]是一个有序序列。(2)循环n-1次,每次使用折半查找法,查找了r[i]在已经排好序的序列了r[1…i-1]的插入位置,然后将其插入到一个表长为i-1的有序序列,依次循环,最后得...原创 2020-02-22 11:02:53 · 391 阅读 · 0 评论 -
直接插入排序
直接插入排序什么是直接插入排序直接插入排序 是一种最简单的排序方法,其基本操作就是将一条记录插入到已经排好序的序列中,从而得到一个新的、记录数量增1的有序表。直接插入排序的算法步骤(1)设待排序的记录放在数组r[1…n]中,r[1]是一个有序序列。(2)循环n-1次,每次使用顺序查找法,查找了r[i]在已经排好序的序列了r[1…i-1]的插入位置,然后将其插入到一个表长为i-1的...原创 2020-02-22 10:40:04 · 159 阅读 · 0 评论 -
Dijkstra算法 最短路径
今天终于写到著名的贪心算法——Dijkstra算法了,内心有点激动。Dijstra算法对很多人来说看起来比较困难,不是很能理解,其实也没什么啦!比如,你要自己驾车从科技大学去博物馆,考虑到利益上涨油价以及一贫如洗的口袋,你不能那么任性,来一场说走就走的旅行,所以你开始像屌丝一样精打细算,寻找一条最短的路径以结束那些不必要的花费。你掏出地图,认真的比较到博物馆去的各种路线,但及其复杂的路网让你眼...原创 2020-02-20 22:34:12 · 331 阅读 · 0 评论 -
B树 二叉树查找
二叉树查找(B树)二叉排序树(Binary Sort Tree)称二叉查找树,它是一种对排序和查找都很有用的特殊叉树。二叉排序树的定义二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:(1)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)它的左、右子树也分别为二叉排序树。二叉排序树是递归定...原创 2020-02-20 21:57:58 · 286 阅读 · 0 评论 -
分块查找
分块查找分块查找( Blocking Search )又称索引顺序查找,这是一种性能介于顺序查找和折半查找之同的一种查找方法。在此查找法中,除表本身以外,尚需建立一个“索引表”。例如,下图所示为一个表及其索引表,表中含有18个记录,可分成3个子表(R1, R2, , R3,R4,R5,R6)、(R7, R8, R9,…R12)、(R13, R14, …, R18),对每个子表(或称块)建立一个索...原创 2020-02-20 21:02:57 · 3455 阅读 · 0 评论 -
折半查找
折半查找折半查找(Binaryear)也称二分查找,它是一种效率较高的查找 但是折半查找要求线性表必须采用顺序储存结构,而且表中元素按关键字有序排列。折半查找的查找过程为:从表的中间记录开始,如果给定值和中间记录的关键字相等,则查找成功;如果给定值大于或者小于中间记录的关键字,则在表中大于或小于中间记录的那一半中查找,这样重复操作,直到查找成功,或者在某一步中查找区间为空,则代表查找失败。为...原创 2020-02-20 20:47:07 · 437 阅读 · 0 评论 -
顺序查找
顺序查找顺序查找的过程为:从表的一端开始,依次将记录的关键字和给定值一次比较,若某各记录的关键字和给定值相等,则查找成功,反之,查找失败!(一个一个比对就是了) #include<iostream> using namespace std; typedef int KeyType;//key类型 typedef struct { KeyType key;//关键...原创 2020-02-20 20:37:38 · 457 阅读 · 0 评论 -
Kruskal算法 最小生成树
Kruskal算法Kruskal的由来Prim算法利用了MST的性质:假设N= (V,E)是一个连通图,U是顶点集V的一个非空子集,若(u,v)是一条最小权值的边,其中u属于U,v属于V-U,则必存在一颗包含(u,v)的最小生成树。Kruskal算法的实现克鲁斯卡尔算法的构造过程假设连通网N=(V, E),将N中的边按权值从小到大的顺序排列。①初始状态为只有n个顶点而无边的非连...原创 2020-02-18 21:00:50 · 347 阅读 · 0 评论 -
prim算法 最小生成树
Prim算法Prim算法的由来Prim算法利用了MST的性质:假设N= (V,E)是一个连通图,U是顶点集V的一个非空子集,若(u,v)是一条最小权值的边,其中u属于U,v属于V-U,则必存在一颗包含(u,v)的最小生成树。Prim算法的实现普里姆算法的实现假设一个无向网G以邻接矩阵形式存储,从顶点u出发构造G的最小生成树T,要求输出T的各条边。为实现这个算法需附设一个辅助数组cl...原创 2020-02-17 21:11:10 · 690 阅读 · 0 评论 -
图的广度优先搜索遍历
广度优先搜索遍历广度优先搜索遍历类似与树的层次遍历,过程如下:(1) 从图中的某个顶点v出发,访问v(2) 依次访问v的各个未曾访问的邻接点(3) 分别从这些邻接点出发依次访问他们的邻接点,并使"先被访问的顶点的邻接点" 先于" 后被访问 的顶点的邻接点"被访问。重复步骤(3),直至图中所有已被访问的顶点的邻接点都被访问到。图例演示:(图片来源于网络)附上代码:/* 广度优...原创 2020-02-16 21:14:17 · 294 阅读 · 0 评论 -
图的深度优先搜索遍历
深度优先搜索遍历深度优先搜索遍历类似与树的先序遍历,过程如下(1) 从图中的某个顶点v出发,访问v(2) 找出刚访问过的顶点的第一个未被访问的邻接点,访问该节点。以该节点为新顶点,重复此步骤,直至访问过的顶点没有未被访问的邻接点为止(3) 返回前一个访问过的且仍有为被访问的邻接点的顶点,找出该顶点的下一个为被访问邻接点,访问该节点(4) 重复 (2)(3) 步骤,直至图中所有结点都被访...原创 2020-02-16 17:40:29 · 306 阅读 · 0 评论 -
二叉线索树的先序、中序、后序的线索化及其遍历
线索二叉树二叉线索树的概念二叉线索树是在传统二叉树结构的基础上,加上判断结点左右孩子是否为空的标志–LTag,RTag。当左孩子为空的时候,lchild指向该节点的前驱结点,当右孩子为空的时候,rchild指向该节点后继结点。以此提高链表的储存密度。下面我们给出二叉线索树的结构: typedef struct BiTNode { char data;//数据域 int LTa...原创 2020-02-15 12:58:12 · 8083 阅读 · 2 评论 -
二叉线索树的线索化以及遍历
//二叉树的创建,递归遍历,非递归遍历,拷贝,深度#include<iostream>#include<stack>using namespace std;////二叉树的结构//typedef struct BiTNode//{// char data;//数据域// int LTag = 0;//左标签// int RTag = 0;//右标签// ...原创 2020-02-15 12:56:49 · 367 阅读 · 0 评论 -
利用哈夫曼树编码与译码
#include<iostream>#include<string.h>#include<stdlib.h>using namespace std;typedef char** HuffmanCode;typedef struct{ int s1 = 0; int s2 = 0;}Num;//返回两个最小数的结构体//哈夫曼树的结构ty...原创 2020-02-13 20:30:06 · 468 阅读 · 6 评论 -
计算器-二叉树实现
#include<iostream>#include<string>#include<stack>using namespace std;//二叉树的结构typedef struct BiTNode{ int data;//数据域 struct BiTNode* lchild = nullptr;//指针必须初始化,c11标准 struct ...原创 2020-02-12 19:22:52 · 1371 阅读 · 2 评论 -
哈夫曼树
本文介绍了哈夫曼树的结构,构造,以及哈夫曼树的带权路径长度的求法。#include<iostream>using namespace std;typedef struct{ int s1 = 0; int s2 = 0;}Num;//返回两个最小数的结构体//哈夫曼树的结构typedef struct { int weight;//节点的权值 int pare...原创 2020-02-11 19:58:31 · 173 阅读 · 0 评论 -
树的遍历
//二叉树的创建,递归遍历,非递归遍历,拷贝,深度#include<iostream>#include<stack>using namespace std;//二叉树的结构typedef struct BiTNode{ char data;//数据域 struct BiTNode *lchild = nullptr;//指针必须初始化,c11标准 str...原创 2020-02-07 20:30:13 · 91 阅读 · 0 评论 -
KMP查找
#include<iostream>#include<string>using namespace std;//BF查询int BF(string S, string T, int pos)//S为主串,T为模式串,pos为查询位置{ int i = pos; int j = 0; while (i < S.length() && j ...原创 2020-02-04 19:56:27 · 215 阅读 · 0 评论 -
循环队列
/*循环队列介绍循环队列采用顺序线性表结构,是一种先进先出的特殊线性结构由于队列是循环的,我们需要判断队列什么时候是满的值得注意的是,我们不能以头尾指针的值是否相同来判断队列空间是否为满我们采用少用一个元素空间的办法来解决这个文题,即队列空间大小为m时,有m-1个元素就认为是队满。这样头尾指针相同时,队空,尾指针循环意义上加一等于头指针队满*/#include<iostrea...原创 2020-02-02 16:20:08 · 231 阅读 · 0 评论 -
链队
#include<iostream>#include<algorithm>#define OK 1#define ERROR 0using namespace std;//队列的储存结构typedef struct QNode{ int data; struct QNode* next;}QNode,*QueuePtr;typedef struct...原创 2020-02-01 18:03:34 · 110 阅读 · 0 评论 -
计算器 - 栈的应用
头文件CHAR.H#pragma once#include<iostream>#define OK 1#define ERROR 0using namespace std;class CHAR{private: typedef struct StackNode { char data; struct StackNode *next; }*Stack;p...原创 2020-01-31 18:48:25 · 145 阅读 · 0 评论 -
链栈
#include<iostream>#define OK 1#define ERROR 0using namespace std;typedef struct StackNode{ int data; struct StackNode *next;}*LinkStack;int InitStack(LinkStack &S)//初始化{ S = NUL...原创 2020-01-30 17:41:41 · 88 阅读 · 0 评论 -
顺序栈
#include<iostream>#define MAX 100#define ERROR -1#define OK 1using namespace std;typedef struct{ int *top;//栈顶 int *base;//栈尾 int stacksize;//栈大小}SqStack;int InitStack(SqStack &...原创 2020-01-30 17:05:53 · 78 阅读 · 0 评论 -
数据结构之循序表
#include<iostream>#include<string>#define MAX 100#define OK 1#define ERROR 0 #define OVERFLOW -1using namespace std;typedef struct//学生结构体 { string no; string name;}Stu;type...原创 2020-01-21 16:05:24 · 264 阅读 · 0 评论 -
数据结构之链表
#include<iostream>#include<string>#define MAX 100#define OK 1#define ERROR 0 #define OVERFLOW -1using namespace std;typedef struct//学生结构体 { string no;//学号 string name;//姓名}Stu;...原创 2020-01-22 15:16:49 · 149 阅读 · 0 评论