- 博客(25)
- 收藏
- 关注
原创 【数据结构初阶】--- 归并排序
用栈模拟的过程中,试想一下,要让左右区间有序,所以先压右区间,再压左区间,然后要弹出栈顶元素,也就是左区间,再将这个区间的右区间、左区间压入栈中,以此类推,在过程中是没有机会进行归并操作的。快排的非递归可以用栈模拟递归的过程,每次弹出区间的两个边界,从这个区间固定一个值的位置,再压入这个值的左右两个区间,这样的过程实际上模拟的是递归的前序遍历,先将本层的事做完,然后去遍历左右区间。由于每次都是将区间平分成两个区间,让左区间有序,让右区间有序,再进行归并,类似递归的过程类似二叉树的结构,因此,
2024-06-26 22:15:39
763
原创 【数据结构初阶】--- 快速排序
极端情况下,这个范围里的值刚好是升序的,right先走,一直找小,找不到,来到了left的位置,依然没找到,所以right继续走,走到了left前面的位置,此时right就已经越界,Swap(&a[left],&a[right])时就会非法访问。在当前范围中选取左边界,中间和右边界三个数,比较大小,将中间的值作为key,与左边界的值进行交换,然后再进行固定key的操作。每次固定好一个数的位置后,去左区间固定一个数,右区间固定一个数,以此类推,直到要固定数的范围只剩一个数或范围不存在就停止。
2024-06-25 19:44:04
922
原创 【数据结构初阶】--- 堆的应用:topk
接下来我来讲解topk是什么把前k个数建成小堆后面N-k个数,依次比较,如果比堆顶数据大,就替换他进堆最后这个小堆的值就是最大的前k个思路:我想要在这些数据中找到前十个最大的数,那我就先向内存中开辟十个数的空间,再读取前十个数(文件中最前面的十个数),同时将这是个数构建成一个小堆,之后从文件中每读取一个数据都与堆顶元素比较,如果大于堆顶元素,就用当前读取到的数覆盖这个堆顶元素,再进行向下调整;如果小于对顶元素那就读下一个数据,一直重复到结束,最终,小堆中的是个元素就是所有数据中最大的十个数。
2024-06-17 19:34:53
808
原创 【数据结构初阶】--- 堆
堆其实就是个完全二叉树堆虽然是个完全二叉树,但它是为了服务数组实现高效排序,因此我们就用数组来实现堆int size;//数组的有效存储个数//数组的容量}Heap;
2024-06-17 19:33:43
1786
原创 【数据结构初阶】--- 栈和队列
说明:top:是指向栈顶的位置,还是栈顶的下一个位置,在初始化讨论capacity:表示栈的容量,因为是用顺序表实现,入栈的时候也需要判断是否现有元素个数是否达到容量arr:就是个指向数组的指针int top;}ST;从队的一头插入元素,另一头弹出元素用链表实现队列,那么就需要用到链表的这个结构体队列想要入栈,是尾插,那么总不能每次插入一次就将链表遍历一遍寻找尾结点,所以,我们需要一个指针tail去记录尾结点。
2024-06-14 22:15:35
970
1
原创 【数据结构初阶】--- 双链表
初始化的时候我们就要创建一个哨兵位,对这个哨兵位进行初始化,哨兵位的prev和next指针都指向自己,里面的data实际上用不上,可以赋值也可以不管,最后返回哨兵位的地址,函数外面实际早已经创建好一个头指针,用来存放这个哨兵位的地址。申请两个指针,一个指针head指向当前的头结点,一个指针head_next指向头节点的下一个节点(即将成为新的头结点),在进行头删操作会方便些,而且代码的可读性很好。和头插思路一样,申请一个临时指针指向尾结点,方便修改哨兵位、新节点、老的尾结点(插入前的尾结点)的指针指向。
2024-06-14 18:27:29
920
1
原创 【数据结构初阶】 --- 单链表
这一节,我所讲的知识都是基于单链表//结点中存储数据的类型//结点中要存储的数据//结点中指向下一个结点的指针}SLTNode;先看这张图:与开头的那张区别就在于头指针phead,这是一个指针变量,用来存放第一个结点的地址,利用该指针就可以依次访问或操作节点中的数据接下来初始化一个指向结点的头指针:(这里是头指针,不是头结点)
2024-06-11 22:47:25
1765
数据结构中常见的8种排序算法,超详细
2024-06-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人