
基础数据结构与算法
文章平均质量分 69
基础数据结构,主要介绍链表,栈和队列
_索伦
结束,还是开始?
展开
-
基础数据结构——快速排序
快速排序原理规则图示C语言代码(递归)优化1.改变排序方法2.三数取中法运行示例评价原理每次找到基准值,以基准值为分界线,左边的值全部比基准值小,右边的值全部比基准值大。规则从右向左找比基准值小的数据,找到后放到左边;从左向右找比基准值大的数据,找到后放到右边;重复 1、2操作,如果 left == right (下标),循环退出,再将基准值放到nums[left]或nums[right]。图示原始数据int nums[] = {333, 124, 0, 65, 15, 7, 22,原创 2021-10-11 17:08:10 · 261 阅读 · 0 评论 -
基础数据结构——基数排序(桶排序)
基数排序基数排序原理图解C语言代码运行示例评价基数排序原理低位(个位)优先,所有数据从低位(个位)开始,依次放入十个桶内,再从桶里取出,直到完全有序。图解第一次按个位入桶第二次按十位入桶第三次按百位入桶C语言代码//获取数组中最大值的位数static int Get_figure(int* arr, int len){ assert(arr != NULL); //获取最大值是多少 int tmp = 0; for(int i=0; i<len; i++) {原创 2021-10-03 20:14:08 · 261 阅读 · 1 评论 -
基础数据结构——简单选择排序和堆排序——笔记自用
选择排序和堆排序选择排序原理图示C语言代码评价堆排序堆的概念原理疑问为什么要调成大顶堆?怎样调节成大顶堆?步骤一: 调节成大顶堆二:将最后一个结点的值和根节点的值交换三:再次调整为大顶堆四:重复二三步骤,直至完全有序C语言代码评价选择排序原理选择排序:每次从待排序序列中找到最小值和待排序序列的第一个值交换。图示(红线右边为待排序序列)C语言代码注意:在每次交换的时候,保存的是最小值的下标。void SelectSort(int* arr, int len){ assert(arr !原创 2021-09-29 23:00:10 · 184 阅读 · 0 评论 -
基础数据结构——冒泡排序和归并排序
冒泡和归并冒泡排序原理图示C语言代码示例小优化评价冒泡排序原理冒泡排序(Bubble Sort)(也叫沉石排序) 是一种交换排序,思想是(按升序):两两相比较,大的向后挪,一轮走完后,最后一个元素就是最大的;依靠这一特性,每一轮找待排序序列的最大值,放到最后。图示C语言代码void Bubble_Sort(int* arr, int len){ assert(arr != NULL); for (int i = 0; i < len - 1; ++i) { for (in原创 2021-09-22 19:15:05 · 1000 阅读 · 0 评论 -
基础数据结构——直接插入排序和希尔排序——自用笔记
插入排序和希尔排序直接插入排序原理代码实现(C语言)评价希尔排序直接插入排序原理每次从待排序队列中取一个值,放到已排序好的队列,再次保持有序,重复这样的动作,直到把待排序队列中的值全部取完。其实和玩扑克牌一样;比如你揭的几张牌是顺子,但到底是不是,你要给他们排个序示例:第二次揭牌结果:继续揭牌:结果:按照这样的方式,最终结果为:代码实现(C语言)void Insert_Sort(int* arr, int len){ assert(arr != NULL); int原创 2021-09-18 19:05:54 · 207 阅读 · 0 评论 -
基础数据结构->串->字符串匹配->BF和KMP算法
基础数据结构——串串的定义空串空格串子串与真子串子串与主串关系字符串匹配BF(朴素算法)错误算法分析正确BF解法代码实现测试BF算法优缺点KMP算法难点失配情况next数组例子KMP代码实现小结串的定义串(string)是由零个或多个字符组成的有限序列,又名叫字符串。一般定义为 S = “a1a2a3a4…an”; (n >= 0), ai(1<= i <= n)可以是字母,数字,或其他字符,i指的是该字符在串中的位置。空串零个字符的串称为“空串”,即 " null string原创 2021-09-08 23:12:14 · 363 阅读 · 0 评论 -
基础数据结构——两个队列实现一个栈
两个队列实现一个栈结构体定义栈的初始化入栈出栈清空和销毁只读接口结构体定义#include "queue.h"//设计我们需要的那个结构体:two_queue_to_stacktypedef struct TQTStack{ Queue q1;//队列1 Queue q2;//队列2}TQTStack, *PTQTStack;调用头文件队列,队列已经实现过。链接:https://blog.youkuaiyun.com/m0_56257585/article/details/119996731?原创 2021-09-06 10:22:50 · 216 阅读 · 0 评论 -
基础数据结构——利用两个栈实现一个队列
利用两个栈实现一个队列规则结构体定义队列的操作初始化入队出队清空和销毁只读接口规则入队:一直向stack1中插入数据出队:1.如果stack2不空,则从stack2中出;2.如果stack2空,则先把stack1中的数据导入到stack2中,再从stack2出栈。示例:栈是先入后出,队列是先入先出。如图,将数据1,2,3插入栈stack1中,把stack1中的数据出到stack2中,这时候是按3,2,1插入stack2中,再从stack2中出数据,保持先入后出原则。整体来看,是数据1,2原创 2021-09-03 14:47:42 · 298 阅读 · 1 评论 -
基础数据结构——队列
队列概念图示时间复杂度顺序表实现结构体定义队列的操作初始化入队出队清空和销毁只读接口判空判满获取有效元素个数循环队列要点链表实现结构体定义链式队列操作初始化入队出队销毁只读接口总结概念队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。是一种先进先出的线性表(First in first out),允许插入的一端称为队尾,允许删除的一端叫做队头。图示时间复杂度队尾入的时候:时间复杂度O(n);队头出的时候:时间复杂度O(1).而栈:不管是顺序栈还是链栈入栈时间复原创 2021-08-30 16:03:43 · 506 阅读 · 0 评论 -
基础数据结构——栈
数据结构——栈栈的概念栈的定义特点例子顺序栈结构体定义stack.h初始化入栈图示出栈图示扩容清空和销毁只读接口链栈定义图示结构体定义初始化入栈图示函数实现出栈图示函数实现清空和销毁只读接口总结栈的概念栈的定义**栈(stack)**是限定仅在表尾进行插入和删除操作的线性表。我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。为什么在表尾进行各原创 2021-08-25 20:45:35 · 430 阅读 · 2 评论 -
基础数据结构——循环链表
循环链表单向循环链表图解代码clist.hclist.cppmain.cpp运行示例就是简单写写笔记,都是基础的知识单向循环链表单向循环链表相比较单链表,唯一的区别,就是让最后一个节点的next域不再指向nullptr,而是指向头结点。图解在初始化头节点时,next域不用再初始化为空,而是指向自己。最后一个结点的next域指向头结点。其实和单链表的主要差异就在循环的判断条件上,单链表是判断plist->next是否为空,而循环链表是判断plist->next是否等于头结点。原创 2021-08-21 20:28:29 · 426 阅读 · 0 评论 -
基础数据结构——双向链表
双向链表双链表的定义程序清单Dlist.hDlist.cppmain.cpp运行结果总结双链表的定义为什么要有双向链表?因为单链表有自身局限性(只能向后跑,不能向前跑),所以当我们需要向前跑的时候,就有了双向链表。双向链表是个啥?和单链表相比,多了一个直接前驱指针。示例:单链表(假设地址为100 200 这些。。。)双向链表程序清单Dlist.h头文件中除了结构体的定义和单链表不同,其他操作基本一样。#pragma once//结构体定义typedef int ElemTy原创 2021-08-13 20:02:15 · 315 阅读 · 4 评论 -
基础数据结构--线性表——单链表
单链表单链表和顺序表的区别程序清单list.hlist.cppmain.cpp示例运行结果总结单链表和顺序表的区别顺序表:逻辑相邻,物理相邻 简单随机访问时间复杂度O(1)插入时间复杂度O(n) 尾插的时间复杂度O(1)删除时间复杂度O(n) 尾删的时间复杂度O(1)查找Search时间复杂度O(n)单链表:逻辑相邻,物理不一定相邻随机访问时间复杂度O(n)插入的时间复杂度O(1) 不需要挪动数据删除的时间复杂度O(1) 不需要挪动数据查找Search时间复杂度O(n)如果我原创 2021-08-11 20:10:15 · 187 阅读 · 4 评论 -
基础数据结构--线性表——顺序表
线性表顺序表定长顺序表sqlist.hsqlist.cppmain.cpp示例不定长顺序表DSQlist.hDSQlist.cppmain.cpp示例唯一的头,唯一的尾,除头之外,其他节点都有唯一的前驱,除尾之外,其他节点都有唯一的后继,线性表有两种形式。顺序表实际是一种权限更多的数组数组功能:读和写例如:int ar[10];ar[0] = 1;int x = ar[0];而顺序表除了这些外,还包括增,删,改,查,获取长度,清空和销毁等功能。定长顺序表设计一个十个空间的定长顺序表:原创 2021-08-09 18:48:20 · 361 阅读 · 2 评论