
数据结构
小陈没烦恼
现在的努力只为将来遇见更好的你!
展开
-
插入排序Java版本
插入排序算法思想插入排序是把第一个元素看作是有序的,将剩下的元素看作是未排序的。然后遍历未排序的序列将每个每个元素分别插入到已排序序列的合适位置。分析假设我们有一个待排序的数组为arr={3,5,4,1,7,2,9,8},现在我们需要对其进行升序排列,那么我们需要通过for循环遍历未排序序列,让每一个未排序元素都与已排序元素进行比较一遍,然后将其将其插入插入到合适的位置。第一次插入的结果:3,5,4,1,7,2,9,8第二次插入的结果:3,4,5,1,7,2,9,8第三次插入...原创 2020-09-11 23:43:33 · 81 阅读 · 0 评论 -
简单选择排序Java版本
选择排序概念选择排序的工作原理是每一次从待排序的数据元素中,选出最小或最大的一个元素存放在序列的起始位置,直到全部待排序的数据元素排完。分析假设我们有一个待排序的数组为arr={3,5,4,1,7,2,9,8},现在我们需要对其进行升序排列,那么我们需要遍历这个数组,让每一个元素都与其他7个元素进行比较一次(这个过程称为排序)每排序一次就可以选择出一个相对最小的元素,并将其放入数组的起始位置。第一次排序的结果:1,5,4,3,7,2,9,8第二次排序的结果:1,2,3,4,5,...原创 2020-09-06 20:03:05 · 94 阅读 · 0 评论 -
线性表的链式存储结构-单链表(c语言版)
什么是链式存储?借助元素存储地址的指针表示数据元素之间的逻辑关系。什么是线性表的链式存储结构?在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。线性表(链式存储)的基本操作1.初始化2.销毁3.清空4.获取长度5.判空6.取值7.插入8.删除定义结构体//定义一个链表的结点(元素) typedef struct LNode{ int data;//数据域 struct LNod...原创 2021-02-01 18:09:01 · 573 阅读 · 0 评论 -
线性表的顺序存储结构-顺序表(c语言版)
什么是顺序存储?借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。什么是线性表的顺序存储(顺序表)?用一组地址连续的存储单元依次存储线性表的数据元素。线性表(顺序存储)的基本操作1.初始化2.销毁3.清空4.取值5.查找6.插入7.删除定义结构体typedef struct //图书信息定义{ int no; //图书编号 char name[50]; //图书名...原创 2021-01-22 06:00:31 · 439 阅读 · 0 评论 -
单链表的创建的两种方式-头插法和尾插法
如果对单链表的基本操作不熟悉可以参考:单链表的基本操作头插法每次将新生成的结点插入到最前面。所以如果我们要想插入的元素在链表中是正序的话,我们在插入元素的时候需要逆序输入。算法描述/*(3)头插法创建链表*/int CreateListHead_L(LinkList &L,int n){ for(int i=n;i>0;i--){ LinkList newNode = (LinkList)malloc(sizeof(LNode));//生成...原创 2021-02-02 19:30:13 · 1260 阅读 · 0 评论 -
循环双向链表的初始化及创建-头插法和尾插法
什么是循环双向链表?为克服单链表的这种单向性特点,在双向链表的结点有两个指针域,一个指向直接后继,另一个指向直接前驱。循环双向链表的操作1.初始化2.头插法创建链表3.尾插法创建链表4.打印链表中的所有元素5.可以把循环单链表和循环双向链表来对比一下来理解。参考文章:循环单链表基本操作循环双链表的结构这个地方要区别循环单链表,单链表中只有一个指针域,而循环双链表有两个指针域。typedef struct DuLNode{ int data; //数...原创 2021-02-03 02:22:43 · 2998 阅读 · 0 评论 -
两个有序链表合并成一个有序的单链表
将这两个有序链表合并成一个有序的单链表要求结果链表仍使用原来两个链表的存储空间,不另外占用其它的存储空间表中允许有重复数据算法描述(1)定义一个合并后的指针pc指向La表的头结点。由于要求不占用新的存储空间,所有用La的头结点当做新表的的头结点。(2)依次从La和Lb表中取出最小的的元素,然后将其链接到新表后,直到其中一个表为空。(3)最后,将La或Lb中剩余的元素链接到新表后即可。算法分析时间复杂度:O(La.length+Lb.length)空间复杂度:O(0)...原创 2021-02-08 00:44:14 · 13069 阅读 · 4 评论 -
栈的顺序存储结构-顺序栈的基本操作
栈的的定义只能在表的一端(栈顶)进行插入和删除操作的线性表。栈的基本操作顺序栈的表示/*定义顺序栈*/typedef struct { int *base; //用于栈存储的基地址 int *top; //指向该基地址的栈顶指针 int stackSize; //栈的大小 }SqStack;顺序栈的初始化/*初始化*/int InitStack_S(SqStack &S){ S.base = (int ...原创 2021-02-10 18:03:31 · 400 阅读 · 0 评论 -
栈的链式存储结构-链栈的基本操作
栈的基本操作链栈的表示/*定义链栈*/typedef struct StackNode{ int data; struct StackNode *next;}StackNode,*LinkStack;链栈的初始化/*链栈的初始化*/int InitStack(LinkStack &S){ S = NULL; return 0;}进栈操作/*链栈进栈*/ int Push(LinkStack &...原创 2021-02-23 14:18:32 · 2065 阅读 · 2 评论 -
队列的顺序存储结构-顺序队列
队列的定义队列是一种先进先出的线性表,它只允许在表的一段进行插入,而在另一端进行删除。在队列中允许插入的一端叫做队尾,允许删除的一端叫做对头。队列的基本操作(1)队列的初始化(2)销毁队列(3)清空队列(4)判空(5)取队列长度(6)取队头元素(7)入队(8)出队定义顺序队列结构typedef struct { int *base; //基地址用于存储队列元素 int front; //头指针 int rear; //尾指针...原创 2021-02-24 09:46:09 · 746 阅读 · 0 评论 -
链表,栈,队列的存储结构定义
线性表线性表的顺序存储结构/*线性表的顺序存储结构 --顺序表*/ typedef struct { int *data; //存储空间的基地址 类似于一维数组a[n] int length; //链表的长度 }SqList;线性表的链式存储结构/*线性表的链式存储结构 --单链表*/ typedef struct LNode{ int data; //数据域 struct LNode *next; //指针域 }LN...原创 2021-03-01 14:45:12 · 165 阅读 · 0 评论 -
交换排序之冒泡排序和快速排序
冒泡排序和快速排序都是通过两两关键字之间进行比较大小然后进行交换位置来进行的所以这里放在一起来学习之前博客里有写过,需要详细的可以在博客里搜索一下这里直接上代码了#include <stdio.h> #define N 20/***打印数组 */void PrintArrary(char desc[],int a[],int len){ puts(desc); for(int i = 0;i<len;i++){ print...原创 2021-11-22 13:37:56 · 173 阅读 · 0 评论 -
插入排序之直接插入排序和希尔排序
直接插入排序和希尔排序都属于插入排序,所以这里把两种算法放到一起来比较一下。希尔排序是在直接插入排序的基础上进行改进的,所以算法很相近。前面的文章有单独讲解两种算法的还有图解,这里就不过多的赘述。#include <stdio.h> #define N 20/***打印数组 */void PrintArrary(char desc[],int a[],int len){ puts(desc); for(int i = 0;i<len;i++...原创 2021-11-20 16:13:06 · 236 阅读 · 0 评论 -
快速排序-C语言版(带图详细)
前言哈喽,大家好,我最近在复习数据结构中的排序算法章节,今天复习到了交换排序算法中的快速排序算法,所以给大家分享一下。一、什么是快速排序?快速排序算法是在几种排序算法中效率最高的一个排序算法了,故称为快速排序,它的时间复杂度为:O(nlog~2~n),相比冒泡排序算法的O(n^2^)有很大的提升。二、算法思想1、选取一个基准元素(一般我们将待排序序列中的第一个元素选取为基准元素)2、将其他元素与基准元素进行比较,比基准元素大的放到基准元素的右边,比基准元素小的放到基准元素的右...原创 2021-09-04 23:02:36 · 16670 阅读 · 6 评论 -
冒泡排序-C语言版(带图详细)
前言相信大家在学习数据结构算法的时候经常会遇到的问题就是,老师讲解完这个算法思想,自己也听懂了,但一到自己写代码就写不出来,或者是即便自己模模糊糊的照着网上的代码自己写出来了,但是过几天就又忘了,其实这就是我们没有深刻的理解的这个算法的思想。接下来,我就结合图例给大家详细的讲解一下。<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">一、什么是冒泡排序?冒泡排序的名字是因为元...原创 2021-09-04 18:42:02 · 54752 阅读 · 9 评论 -
图的存储结构以及深度优先遍历-C语言版
前言学完图的深度优先遍历算法后,如何将我们的逻辑思维通过代码来实现呢?由于书中给的都是伪代码,所以这里大家实现了一下。一、图在计算机中如何存储呢?图跟其他数据结构类似也有两种存储结构那么就是,顺序存储结构和链式存储结构。1.顺序存储那么,现在有一个如下的图,需要采用顺序存储结构来存储到计算机中。是如何实现的呢?我们通过一维数组来存储图的顶点,通过邻接矩阵(二维数组)来存储边。 这样我们就可以通过计算机来描述这个图了。邻接矩阵:表示顶点间相邻关系的矩阵一维数组...原创 2021-09-04 17:35:47 · 1164 阅读 · 0 评论 -
矩阵的加法C语言实现(可运行)
天下文章一大抄,看了好多博客,内容都是一模一样的,很少有自己写的,代码也没有注释,难受想哭!!!这里呢,我就自己记录一下供大家参考学习#include <stdio.h> #define Maxsize 10 //三元组结构体 typedef struct { int e; //元素的...原创 2021-12-01 12:04:01 · 2341 阅读 · 0 评论 -
队列的链式存储结构-链式队列
链式队列的基本操作(1)队列初始化(2)销毁队列(3)判断队列是否为空(4)获取队头元素(5)入队(6)出队定义链式队列的结构typedef struct QNode{ int data; struct QNode *next;}QNode,*QueuePtr;typedef struct { QueuePtr front; //头指针 QueuePtr rear; //尾指针 }LinkQueue;链式队列的初始化...原创 2021-03-01 15:42:22 · 208 阅读 · 0 评论 -
循环单链表的创建及插入-头插法和尾插法
什么是循环链表?循环链表是另一种形式的链式存储结构,它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。循环链表的操作1.初始化2.头插法创建链表3.尾插法创建链表4.打印链表中的所有元素5.其他的操作通普通单链表相同,这里不在赘述。参考文章:单链表基本操作初始化链表在初始化链表这里需要注意区分与普通单链表的差别。普通单链表初始时把头结点的下一个结点指向NULL。循环单链表初始化时把头结点的下一个结点指向了头结点本身。/*初始化链表*...原创 2021-02-03 08:42:35 · 4187 阅读 · 1 评论 -
大根堆的创建-java版本
一、介绍大根堆就是所有父结点都比它的左右孩子大。存储结构:采用数组进行存储,同完全二叉树的存储一样。数组从0开始则:2i+1为左孩子,2i+2为右孩子。数组从1开始则:2i为左孩子,2i+1为右孩子。二、算法思想若数组长度为n,根据完全二叉树的性质可知:(1)1到n/2 为父结点(2)n/2+1到n为叶子节点...原创 2022-04-16 10:58:54 · 887 阅读 · 0 评论 -
奇偶排序c语言实现
代码实现#include<stdio.h> void PrintArrary(char desc[],int a[],int len){ puts(desc); for(int i = 0;i<len;i++){ printf("%d ",a[i]); } printf("\n");}int odd_even_sort(int a[],int len){ int flag = 0,temp; //flag用来标识 序列是否有序 初始状态是无序的 while(原创 2021-12-14 22:43:29 · 1045 阅读 · 0 评论 -
统计矩阵中元素既是所在行的最小值也是所在列的最小值
编写一个函数,对给定m*n的矩阵A,统计这个矩阵中具有以下特征元素,该元素既是所在行的最小值,也是所在列的最小值,打印出这些特殊元素以及坐标算法思想第一步 确定每一行元素的最小值 记录下最小值以及坐标第二步 根据第一步确定该行元素的最小值,在该行最小元素的所在列查找 该列的最小值 并记录下来该列的最小第三步 比较 一 二 步记录的最小值,如果相同则打印该元素 及其 坐标代码实现#include<stdio.h> #define M 3#define N 4int old_e.原创 2021-12-10 23:00:20 · 1079 阅读 · 0 评论 -
三元组矩阵的加法C语言实现(可运行)
稀疏矩阵A和B都是三元组原创 2021-12-01 00:40:51 · 2483 阅读 · 1 评论 -
kmp模式串匹配算法
kmp算法和求next数组以及nextval数组的代码实现,可以真机运行。原创 2021-05-04 22:27:11 · 193 阅读 · 0 评论 -
中缀表达式求值C语言实现
采用栈来实现中缀表达式求值问题原创 2021-05-01 22:06:05 · 3074 阅读 · 4 评论 -
图的深度优先遍历C语言实现可运行
学完图的深度优先遍历算法后,如何将我们的逻辑思维通过代码来实现呢?我们通过一维数组来存储图的顶点,通过邻接矩阵(二维数组)来存储边。原创 2021-04-12 18:08:39 · 4380 阅读 · 0 评论 -
插入排序之希尔排序-(带图详细)
目录一、什么是希尔排序二、算法思想三、实例讲解算法分析时间复杂度空间复杂度稳定性五、代码实现六、运行结果一、什么是希尔排序希尔排序(Shell’s Sort)又称“缩小增量排序”,它也是插入排序的一种,但时间效率上较直接插入排序有较大的改进。希尔排序是对直接插入排序算法的一种改进,对直接插入排序算法分析,其时间复杂度为O(n2),若待排序序列正序的时候时间复杂度为O(n),由此可知,待排序序列基本有序时其效率高。从另一方面看,直接插入排序算法简单,若待排序序列元素少时,也不需要进行大量的移动和比原创 2021-04-07 22:35:12 · 765 阅读 · 0 评论 -
直接插入排序-C语言(带图详细)
经典插入排序算法-直接插入排序算法带图详细(动图)直接插入排序是一种最简单的排序方法,其基本操作是将需要排序的元素插入到已排好的有序表序列中,从而得到一个完整的有序序列。原创 2021-04-04 18:39:08 · 31008 阅读 · 3 评论 -
交换排序算法之快速排序-C语言版(带图详细)
快速排序算法是在几种排序算法中效率最高的一个排序算法了,故称为快速排序,它的时间复杂度为:O(nlog2n),相比冒泡排序算法的O(n2)有很大的提升。原创 2021-04-03 20:44:47 · 3864 阅读 · 0 评论 -
交换排序算法之冒泡排序-C语言版(带图详细)
相信大家在学习数据结构算法的时候经常会遇到的问题就是,老师讲解完这个算法思想,自己也听懂了,但一到自己写代码就写不出来,或者是即便自己模模糊糊的照着网上的代码自己写出来了,但是过几天就又忘了,其实这就是我们没有深刻的理解的这个算法的思想。接下来,我就结合图例给大家详细的讲解一下。原创 2021-04-02 16:38:01 · 6271 阅读 · 2 评论 -
单链表的基本操作-单链表的创建、插入、删除结点等
序言本文主要包括:(1)单链表的创建(2)创建结点(3)打印结点(4)链表的插入【头插法】(5)链表的删除【指定位置删除】适合新手初步认识学习单链表的基本操作、各个操作都在一起,也有注释。欢迎大家留言讨论!一、代码:#include <stdio.h>#include <stdlib.h>#include<string.h&...原创 2019-12-19 08:29:49 · 2063 阅读 · 0 评论