数据结构
维欣~
这个作者很懒,什么都没留下…
展开
-
【数据结构】八大排序的总结(干货)
八大排序——按方式划分一、插入排序1、直接插入排序2、希尔排序二、选择排序3、简单选择排序4、堆排序三、交换排序5、冒泡排序6、快速排序四、归并排序7、归并排序五、基数排序8、(基数排序)桶排序二、八大排序的效率一、插入排序1、直接插入排序====》详讲简单插入排序及完整代码将数据分为已排序部分和未排序部分,将第二个数据存放在tmp中,将它与它前面的每个数字进行比较,找到合适位置并插入已排...原创 2020-05-03 20:35:14 · 864 阅读 · 1 评论 -
【数据结构】八大排序之基数排序(桶排序代码详述)
一、思想1、核心对每一位数据找到个位,十位、百位…然后将数据按照位数放在对应的桶中,再按照桶的顺序从前往后、从上到下取出,这样每次从个位、十位、百位,一直到最大的位数都是顺序排列的2、图解桶排序过程3、思考(1)怎么找到每个数据的位数?用每一位数进行比较,找到最大的数字,在设置一个计数器count,把最大数每次除10,count++,直到为0,退出,最终count的值为最大值的位数...原创 2020-04-23 17:08:14 · 424 阅读 · 0 评论 -
【数据结构】八大排序之归并排序以及完整代码
一、思想1、基于分治策略把大规模问题划分为小规模问题,集中起来解决小规模的问题,从而导致整体的大规模问题被解决。2、核心归并排序就是分和合的过程,为什么会这么说??他就是想办法在怎样的情况下让他是有序的,如果是一个数据,那我们是不是可以认为他不用排序都是有序的。分:把数组中的数据划分成一组一组的小组,并且保证组内有序。合:把分好的小组又进行合并,合并后的小组要保证组内有序。3、怎样划...原创 2020-04-22 21:03:56 · 297 阅读 · 0 评论 -
【数据结构】八大排序之快速排序的五个优化
所有的优化我只写了改动部分,有需要可以参考快速排序的常规版完整代码及其思想一、快排的优化1、随机取基准点(1)问题如果数据基本有序时,快排会一步一步找基准点进行递归遍历,这时递归层次达到了最大,效率最低,对于这种情况,我们怎么优化??(2)思考我们知道对于快排,他最适用于数据乱序,如果数据越有序,效率越差,那我们是不是可以认为将顺序的数据扰乱是不是就可以了,将数据扰乱也就是不按顺序找...原创 2020-04-22 14:28:27 · 387 阅读 · 0 评论 -
【数据结构】八大排序之快速排序以及优化
一、思想1、基于分治策略核心:选择基准点,将比基准点小的数放在基准点左边,比基准点大的数放在基准点右边。2、分析思想如何选择基准点??首先我们选择第一个数据为基准点放在变量 key 中,那么0号位置就暂时成为无效位。但是并不是每次都选择第一个数据,举例:从上述我们可以发现(1)如果从左往右比较,小数不移动,就继续按顺序++,如果从右往左比较,大数不移动,继续按倒叙–。(2)如果移...原创 2020-04-22 00:53:35 · 3177 阅读 · 0 评论 -
【数据结构】八大排序之冒泡排序以及优化
一、设计思想1、我们可以把冒泡排序理解为不断地将大数向后移动,小数向前移动的过程。2、举例(1)先定义两个变量 i 和 j ,初始状态都在0的位置,让 j 和 j + 1 位置的数据进行比较,如果 j 大,就进行数据交换,如果 j + 1大就不移动,一直 j++,直到这一趟更便利结束。(2)让 i ++,每进行一趟就++一次,原因是,我们用 i 来控制每一趟已经处理的已排序的个数。(...原创 2020-04-21 13:03:38 · 206 阅读 · 0 评论 -
【数据结构】八大排序之堆排序
一、思想1、堆排序满足完全二叉树,完全二叉树可以简单地理解为必须先有左孩子再有右孩子。举一个完全二叉树的例子,就不做详细说明了。2、在进行堆排序之前,我们要先创建,可以创建两种类型的堆(1)大顶堆:堆顶元素>左右孩子的数据(2)小顶堆:堆顶元素<左右孩子的数据堆只比较的是父亲和孩子的关系3、对于堆排序,借助大顶堆做升序,借助小顶堆做降序,思想都是一样的,这里我用大顶堆做...原创 2020-04-20 23:12:06 · 436 阅读 · 0 评论 -
【数据结构】八大排序之简单选择排序
一、思想核心:在待排序部分找到最小的值放在待排序的起始位置作为已排序部分。具体代码思想如下:(1)划分已排序部分和待排序部分(起始时我们认为整个数组都为待排序部分)(2)i标识待排序部分的起始;min存放当前待排序部分中最小元素的下标,开始时在待排序部分的起始位置,即min=0;j标识待排序部分的第一个元素位置,开始时在min的下一个位置。(3)判断j中存放的元素是否大于min中存放...原创 2020-04-20 16:13:50 · 266 阅读 · 0 评论 -
【数据结构】八大排序之希尔排序(shell)
一、设计思想1、在简单插入排序中,我们怎样能做到让算法尽可能地高效率???我们知道只有在数据尽量越靠近顺序排序的时候,我们的效率就越高。所以希尔排序就是对简单插入排序进行的优化。核心思想:我们设计几个增量,按增量把数据化分成小组,先使组内有序,从而达到整体趋于有序,随增量的缩减,整体会逐渐更加趋于有序。注:①最后一次增量必须为1,也就是最后一次对整体进行简单插入排序。②对于增量的设置我们...原创 2020-04-20 14:36:41 · 405 阅读 · 0 评论 -
【数据结构】八大排序之简单插入排序
一、设计思想1、核心简单插入排序就类似于打牌前的摸牌,每摸一张牌,把牌按从小到大的顺序从左到右放置,每次你摸到一张牌就开始一张一张比较,移动已经放好的牌,放在找到的合适的位置上。核心在于(1)找到合适的位置(2)移动数据所以我们会把数据分为已排序部分和待排序部分2、设计思想(1)首先数据肯定是存放在数组中的,我们就先定义为arr[ ];把已排序部分的最后一个数据标记为 j ,把待排序部...原创 2020-04-19 21:55:40 · 233 阅读 · 0 评论 -
【数据结构】(难点)KMP算法的设计思想与实现
KMP一、设计思想1、KMP的核心2、回退思想KMP的思想:KMP遍历图解:3、next的求解(1)手动计算next的值(2)理论分析当串中元素相等时当串中元素不相等时一、设计思想1、KMP的核心解决的BF算法中主串回退的问题,提高了效率,所以KMP中最核的问题是找到模式串要回退的位置2、回退思想(1)在此之前让大家明白一个概念:最大前缀和最大后缀相等:在串中,从第一个下标位置开始找到...原创 2020-04-19 18:45:09 · 1975 阅读 · 0 评论 -
【数据结构】串的匹配操作及相关代码
一、简介1、定义子串:串中的一部分字符主串:原本的串空串:不存在任何字符,是任意串的子串(可以用数学里面的集合来理解)2、匹配用模式串在主串中进行匹配如果模式串和子串成了这样,那就称为模式串在主串10号位置上匹配成功3、串的匹配算法——朴素匹配算法即进行群举,把可能匹配的所有情况都进行匹配朴素匹配算法又称BF算法BF算法思想:(1)首先用主串0号下标的元素和模式串0号...原创 2020-04-18 15:45:44 · 340 阅读 · 0 评论 -
【数据结构】串的相关操作以及代码实现
一、认识串的相关结构1、串与字符串串是一系列有限字符的集合,它是有固定长度的,串中存放的数据都是以串为单位的而字符串是以\0结尾的2、串的结构(1)固定长度的串:#define MAXSIZE 10struct String{ char str[MAXSIZE];//存储串字符的数组 int len;//当前串的长度};(2)变长的串struct String{ ...原创 2020-04-18 12:53:39 · 557 阅读 · 0 评论 -
【数据结构】【面试题】单链表的逆置思想与代码实现
一、设计思想这是逆置前我们得到的链表(1)定义一个指针pCur,让他指向第一个数据结点(2)生成一个指针pNext,指向pCur的下一个结点(3)把头结点和第一个数据结点的指向断开,这样前面的部分生成了一个新的空链表,而后面的部分变成了一个结点集合(4)把pCur和pNext之间的指向断开,把pCur头插在前面的空链表中(5)最后把pCur指向pNext,等待下一次操作(6)依...原创 2020-04-17 19:07:53 · 248 阅读 · 0 评论 -
【数据结构】链表队列的设计与完整代码的实现
链队一、链队的结构分析二、代码分析1、结构定义2、初始化3、判空4、出队(头删)三、完整代码Queue.hQueue.cppmain.cpp一、链队的结构分析1、链队是以链表的形式实现队列的先进先出(FIFO)的特性这是链表的结构单元设计,那么我们现在需要思考的是,我们是① 从头部入队插入元素,尾部出队删除元素②从尾部入队插入元素,头部出队删除元素(1)如果是从头部入队插入元素,尾部...原创 2020-04-16 22:36:21 · 558 阅读 · 0 评论 -
【数据结构】循环队列的完整代码实现
代码实现Queue.htypedef int ElemType;#define MAX_SIZE 10typedef struct Queue{ ElemType arr[MAX_SIZE]; int front;//队头指针,存的是下标 int rear;//队尾指针}Queue,*pQueue;void init(pQueue pqu);int full(pQueu...原创 2020-04-16 15:10:44 · 785 阅读 · 0 评论 -
【数据结构】队列之循环队列的实现
队列之循环队列一、认识队列1、先进先出FIFO2、顺序队列3、分析存储结构二、循环队列1、最优解决方法2、结构定义3、初始化4、判空和判满5、入队(插入)操作6、出队(删除)操作7、获取队头元素8、获取队尾元素一、认识队列1、先进先出FIFO从队尾插入,从队头删除用front标记队头,rear标记队尾2、顺序队列顺序队列是基于数组形式来实现的队列(1)第一种情况,队头arr[0]...原创 2020-04-16 15:08:36 · 867 阅读 · 0 评论 -
【数据结构】链栈的设计与实现
对于链表来说,同样要遵循先进后出(FILO),要在一个方向push,一个方向pop,因为头插和头删的时间复杂度最好(O(1)),所以结构使用了头插和头删来实现Stack.htypedef int ElemType;typedef struct Node{ ElemType data; struct Node* next;}Node,Stack, *pStack;void init...原创 2020-04-15 18:28:02 · 193 阅读 · 0 评论 -
【数据结构】顺序栈(Stack)的设计与实现
一、了解栈1、遵循**先进后出(FILO)**的原则2、栈的数据结构分为顺序栈和链栈顺序栈:以基于顺序表的形式来实现栈的特性。而顺序表的底层放的是数组链栈:以基于链表的形式来实现栈的特性。而链表的底层放的就是链表3、顺序栈(1)再进行操作前,我们要先想想应该怎么插入元素?该如何知道数组中当前哪个位置可以插入元素?那么我们需要定义一个标识用来标记可存放的位置(2)用栈顶指针来存储每个...原创 2020-04-15 13:27:12 · 1027 阅读 · 0 评论 -
【数据结构】链表中不起眼的静态链表
一、回顾链表二、静态链表1、静态链表中的数据存储在堆上2、把静态链表存储的堆内存看成一个数组,数组中的每个元素都由数据域和游标域组成,并且每个元素都含有下标3、静态链表会给出提前预留的结点,这样会导致一部分结点已使用,一部分结点未使用,所以将第一个数组和最后一个数组牺牲掉,即不存放数据。4、可将第一个数组作为未使用部分的头结点;最后一个数组作为已使用部分的头结点5、-1为一部分链表的...原创 2020-04-14 21:02:23 · 151 阅读 · 0 评论 -
【数据结构】链式存储——不带头结点的单链表
不带头结点的单链表一、简介1、回顾单链表2、分析不带头结点二、代码与实现1、结构定义2、初始化三、插入操作1、生成新结点2、头插3、尾插四、删除操作1、判空操作2、头删3、尾删五、查询操作六、销毁一、简介1、回顾单链表单链表的结构(带头结点的)2、分析不带头结点因为我们都知道头结点无实际意义,所以如果我们不想带头结点,只想要数据结点,该怎么做?不带头结点的单链表也需要唯一的起始,唯一...原创 2020-04-14 17:51:48 · 2298 阅读 · 1 评论 -
【数据结构】——链式存储结构之双向链表
文章目录一、双向链表存储结构1、了解2、定义3、结构二、双链表的结构设计三、初始化四、插入操作1、开辟新结点pnewnode2、分析3、头插:将元素插入头结点之后3、尾插:将元素插入整个链表的尾部4、获取当前的链表长度:判断位置是否合理5、按位置插入(pos为插入位置)四、删除操作1、判空2、头删:删除头结点的下一个结点3、尾删:删除尾部结点4、按位置删除五、查询单链表一、双向链表存储结构1、...原创 2020-04-12 22:21:09 · 3222 阅读 · 0 评论 -
【数据结构】 链式存储结构之单链表
链表一、链式存储结构1、了解2、定义3、结构4、头指针5、头结点二、单链表的声明三、单链表的初始化三、插入操作1、开辟新结点pnewnode2、头插:将元素插入头结点之后3、尾插:将元素插入整个链表的尾部4、计算数据结点的个数一、链式存储结构1、了解顺序存储结构是像一条线一样的存储,在进行增删改查时,能明确的知道每个数据都是一个后面就是下一个。那如果数据没有按线性存储该如何查找数据呢?有...原创 2020-04-09 16:51:49 · 2692 阅读 · 0 评论 -
【数据结构】顺序表的设计与实现
一、基础知识1、顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般采用数组存储,在数组上完成增删改查等。2、线性表可以采用线性存储和链式存储(1)线性存储是在一片连续的单元中连续进行存储,它把逻辑上相邻的数据元素存储在物理上相邻的存储单元(2)链式存储是在每个结点中包含指针域,它可把逻辑上相邻的元素放在物理上不相邻的存储单元3、顺序表的线性存储示意图假设线性表中有n...原创 2019-05-01 16:18:46 · 1122 阅读 · 0 评论 -
【C语言】时间复杂度和空间复杂度
一、算法效率算法效率分为时间效率(时间复杂度)和空间效率(空间复杂度)用O来表示时间复杂度和空间复杂度1、时间复杂度:衡量一个算法的运行速度(1)计算算法中的基本操作的执行次数(2)推导大O阶法方法:①去掉系数,所有系数按1处理②在修改后的运行次数函数中,只保留最高阶项2、空间复杂度:衡量一个算法所需要的额外空间3、有些算法的时间复杂度存在最好、最坏和平均情况(一般关注最坏)...原创 2019-04-22 11:39:26 · 382 阅读 · 1 评论