数据结构
文章平均质量分 64
基础数据结构的讲解以及代码
悲伤土豆拌饭
做一个cool guy
展开
-
HashTable 哈希表讲解与代码实现
Hash Table哈希表哈希冲突处理哈希冲突开放寻址法拉链法Hash Table的结构Hash Table方法实现哈希表简单的讲,哈希表类似于电话簿,通过首字母索引迅速查找我们需要的目标哈希表的本质是数组例图,将学号101011经过哈希函数计算得到 1 ,这个1就告诉我们把Entry放到哈希表的什么地方,所以理论上讲这个1就是数组的下标。数组中1的位置存放的是一个Entry,它不是一个简单的单个数值,而是一个键值对,也就是存放了key和value,key就是学号101011,value就是原创 2021-04-24 18:50:13 · 299 阅读 · 0 评论 -
数据结构基础——队列
队列什么是队列顺序队列顺序队列的结构声明队列的操作方法队列的初始化_InitQueue插入元素_Push判满_Full申请空间_AppendSpace弹出队顶元素_Pop判空_Empty队顶元素_Top销毁队列_DestroyQueue什么是队列队列是一种特殊的线性表,单向队列只能在一端插入数据(后),另一端删除数据(前);它和栈一样,队列是一种操作受限制的线性表;进行插入操作的称为队尾,进行删除操作的称为队头;队列中的数据被称为元素;没有元素的队列称为空队列。(First In First Out,F原创 2021-04-24 16:49:51 · 165 阅读 · 0 评论 -
排序算法——冒泡排序
排序算法——冒泡排序冒泡排序思想排序算法的实现冒泡排序思想将待排序数据序列的相邻两个数据(0,1 1,2 2,3 3,4 。。。 n-2, n-1)进行比较,然后将大的数据向后交换。一趟比较之后,就可以将最大的数据交换到最后。接下来,在对剩余的数据(除过最后一个数据)在进行冒泡排序。经过n-1次后,整个数据序列就有序了。例:有这样一个无序数组。将下标0和1的两个数字比较,如果前面比后面大则将两个数字交换,随后继续比较下标1和2两个数字。81 与 79 相比 81 大,则将 81 放在原创 2021-05-07 22:09:40 · 431 阅读 · 0 评论 -
排序算法——基数排序
基数排序关于基数排序的思想基数排序代码实现关于基数排序的思想基数排序是针对有多个关键字(每个关键字的权重不同)的排序算法: 炸金花(花色,数字)。基数排序时桶排序的一种推广,它所考虑的待排记录包含不止一个关键字。例如对一副牌进行整理,可将每张牌看做一个记录,包含两个关键字:花色、面值。一副理顺的牌是按如下顺序进行排放的: 针对于一组整形数据: 按照权重划分(个位,十位,百位,千位 … )。 按照从小权重到大权重进行处理。对于一个数据,拿到这一位的值,将原始数据存储到相应的队列中。一个原创 2021-11-18 20:22:59 · 885 阅读 · 0 评论 -
排序算法——堆排序
堆排序首先一些基础概念堆排序的思路代码实现首先一些基础概念二叉树: 每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现[二叉查找树]和二叉堆。 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树 完全二叉树: 一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编原创 2021-11-17 23:07:10 · 502 阅读 · 0 评论 -
排序算法——快速排序
快速排序怎么做到快速排序快速排序的代码实现递归实现非递归实现怎么做到快速排序在数组中选一个基准数(通常为数组第一个);将数组中小于基准数的数据移到基准数左边,大于基准数的移到右边;对于基准数左、右两边的数组,不断重复以上两个过程,直到每个子集只有一个元素,即为全部有序。 left和right分别为待排序序列的区间左右下标,先选取一个数据作为基准,right从后向前找比基准小的数据,找到后存储到left位置(而不是交换当前left和right位置的数据),然后left从前向后找比基原创 2021-11-18 09:54:34 · 286 阅读 · 0 评论 -
排序算法——直接插入排序
排序算法——直接插入排序直接插入排序思想直接插入排序的实现直接插入排序思想将待排序序列看成两部分,左部分为已经有序的,右部分为无序的(第一次左部分只有一个数据)。循环从右部分拿一个数据插入到左部分中(从左部分的最后一个数据开始比较,如果比拿的数据大,则将其向后挪动一个位置,直到找到比他小的,或者左部分遍历完),并且使得插入后的结果依旧有序。直到有部分没有数据为止!即将数组分为左右两部分,一开始左部分只有一个元素,左右部分想接触的两个数进行比较,若左边小于右边则不进行操作,若右边小于左边则,两元素交换并原创 2021-05-09 16:04:22 · 249 阅读 · 1 评论 -
排序算法——希尔排序
希尔排序什么是希尔排序为什么不直接使用插入排序希尔排序代码实现什么是希尔排序希尔排序也叫做:缩小增量排序。 分组(分组的组数需要循环递减,直到减为1)排序。先将待排序序列分成若干组,然后使用直接插入排序在组内排序。循环着将分组数减小,执行以上过程。直到分组减为1. 所有的分组数都互质。分组可为任意数字,且每次分组数都比上一次分组要小,直至分组数为1。为什么不直接使用插入排序相比较插入排序,希尔排序输入直接插入排序的一种,但是在两种算法的比较上希尔排序: 就是直接插入排序的优化, 数据原创 2021-11-17 20:26:48 · 2278 阅读 · 4 评论 -
排序算法——归并排序
归并排序怎么做到归并排序递归排序代码实现怎么做到归并排序将数据划分成不同的区间段(每个区间段已经有序),初始时,每个区间段只有一个数据。将相邻两个区间段合并到一块。重复这个过程,直到只剩下一个区间段。最终所有元素都在同一组,且保持有序归并排序时间复杂度: O(nlogn)空间复杂度: O(n)稳定性: 稳定的递归排序代码实现void Meger(int *arr, int len, int width, int *brr) // width每个段的数据量个数{ in原创 2021-11-18 17:16:17 · 80 阅读 · 0 评论 -
八大排序算法(c语言)
八大排序算法冒泡排序冒泡排序思想排序算法的实现选择排序选择排序思想选择排序的实现直接插入排序直接插入排序思想直接插入排序的实现希尔排序什么是希尔排序为什么不直接使用插入排序希尔排序代码实现堆排序首先一些基础概念堆排序的思路代码实现快速排序怎么做到快速排序快速排序的代码实现递归实现非递归实现归并排序怎么做到归并排序递归排序代码实现基数排序关于基数排序的思想基数排序代码实现冒泡排序冒泡排序思想将待排序数据序列的相邻两个数据(0,1 1,2 2,3 3,4 。。。 n-2, n-1)进行比较,然后原创 2021-11-19 19:16:18 · 740 阅读 · 0 评论 -
排序算法——选择排序
排序算法——选择排序选择排序思想选择排序的实现选择排序思想先遍历一遍待排序数据,从中标记出最大的数字(或者最小的数字)的位置,将标记出的数据与当前最后一个或者第一个数据进行交换。这一趟就是找到最大的或者最小的数字,并且将其放到一个合适的位置。 循环执行此过程,直到只剩下一个数字。例 此数组遍历寻找数组中最大的元素例如此时,下标4 的数字93>63,则max_index=4。然后继续向后比较一直比较到最后一位时,93依旧是最大数,则将下标4(max_index)与下标9(数组最原创 2021-05-07 22:55:27 · 253 阅读 · 0 评论 -
数据结构基础——栈
栈什么是栈栈的代码实现顺序栈的结构顺序栈的操作方法方法的实现InitStack__栈的初始化Push__入栈Top__获取栈顶数据Pop__弹出栈顶数据Empty__判空DestryStack__销毁栈链式栈的实现栈的应用中缀转后缀两个栈实现一个队列什么是栈关于栈,在 如何使用两个栈实现一个队列 中粗略介绍过,下面将详细接受栈以及栈代码的实现。栈 符合 先进后出,后进先出!——函数调用堆栈,类似于弹匣的结构。栈底: 栈的存储空间的最底下的位置。一般是一块空间的首地址。栈顶: 动态变化的位置原创 2021-04-13 17:48:06 · 433 阅读 · 2 评论 -
如何使用两个栈实现一个队列
如何使用两个栈实现一个队列栈和队列首先什么是栈什么是队列两个栈实现队列的思想代码实现栈的定义入栈、出栈、判空、判满等基础代码两个栈实现队列栈和队列首先什么是栈栈:遵循 先进后出,后进先出。栈底:栈的存储空间的最底下的位置,一般是一块空间的首地址。栈顶:动态变化的位置,会随着入栈和出栈操作再申请的空间上左右滑动。栈大小:记录总共能够存储的元素的个数栈初始化时 会创建 top 当栈为空时 top 会指向栈的第一个元素#define INITSIZE 5typedef struct Stac原创 2021-03-30 00:08:49 · 426 阅读 · 2 评论 -
数据结构基础——双向链表
双向链表什么是双向链表双向链表的实现1、结构的声明2、方法的声明3、方法的实现什么是双向链表首先,双向链表一样是链表,逻辑上存储连续,物理上存储不连续。但是相对于单链表每个结点存储两个数据(data 数据 next 下一个结点的地址),双向链表每个结点存储三个数据,比普通链表多 prior 储存上一结点的地址。双向链表的每个结点除了存储后一个结点的地址,还需要存储前一个结点的地址。 – 从前向后遍历和从后向前遍历双向链表的实现1、结构的声明typedef double DataType原创 2021-04-11 11:38:58 · 495 阅读 · 2 评论 -
中缀转后缀
中缀转后缀规则实现规则实现static void ClearStack(Stack *st){ while(!Empty(st)) { ElemType value; Top(st, &value); printf("%c ", value); Pop(st); } printf("\n");}static void DealRightPare(Stack *st){ int flag = 0; while(!Empty(st)) { ElemT原创 2021-04-13 17:46:58 · 116 阅读 · 1 评论 -
数据结构基础——顺序表
顺序表什么是顺序表顺序表的实现声明方法的实现什么是顺序表顺序表在逻辑上是连续的,在物理存储空间上也是连续的。 — 数组顺序表中存储的数据元素必须从空间的首位置开始存储,而且必须连续存放,中间不能有空的空间。顺序表的实现声明// 结构的声明typedef int DataType;typedef struct SqList{ DataType* data; // 指向存储空间的指针 int length; // 已经存储的元素的个数 int原创 2021-04-10 16:13:25 · 403 阅读 · 0 评论 -
数据结构基础——单链表
单链表单链表的概念单链表的实现头结点单链表1、结构声明2、方法的声明3、方法的实现头指针单链表1、结构的定义2、方法的声明3、方法的实现单链表的概念链表和顺序表的区别: 链表在逻辑存储上是连续的,在物理存储上是不连续的。 单链表属于链表中的一种,每一个存储数据的节点除了存储数据本身之外,还需要存储其直接后继结点的地址。例: 32位系统存储10个整形(int 4个字节)数据: 顺序表存储: 总共需要的堆区空间: 40个字节 单链表存储: 总共需要的堆区空间:原创 2021-03-29 22:56:22 · 415 阅读 · 0 评论