数据结构
文章平均质量分 69
th15t13
这个作者很懒,什么都没留下…
展开
-
快速排序:挖坑法、前后指针法和三数取中优化
上一篇博客中,我们看过了快速排序的基本方法——霍尔法的递归实现。事实上,区间划分也可以通过挖坑法和前后指针法来完成,从而实现快速排序。那么本篇博客,我们来讲解这两种方法。 一、挖坑法 顾名思义,此方法的思路是将位置空出来(存入临时变量),再将找到的数据填入这个空白位置。如下图: 可以看到,利用end和begin寻找比基准值小和大的元素的思路不变,在寻找到之后,直接将找到的元素“填入”“坑”中,最后再将基准值填入,就完成了一趟排序。代码如下: int partition2(int* arr, int be原创 2021-01-28 15:08:30 · 362 阅读 · 0 评论 -
快速排序的实现(hoare划分)
原理 快速排序的本质是给基准数据寻找合适位置的过程。以升序为例,每一趟排序结束以后,可以保证基准数据左边的数据全部小于它,右边的数据全部大于它,这也表明这一基准数据已经处于它的最终位置了。 想要做到上述这一点,基本方法(称为霍尔(Hoare)法))如下: 1、将需要排序的区间中的第一个数据作为基准数据,记为key 2、从区间的最后一个数据向前寻找小于key的数据,记为end 3、从区间的第一个数据向后寻找大于key的数据,记为begin 4、交换begin和end所在位置的数据,重复2、3的操作 5、若be原创 2021-01-25 22:07:41 · 855 阅读 · 0 评论 -
二叉树非递归遍历
文章目录一、准备工作二、前序遍历三、中序遍历四、后序遍历 LeetCode OJ链接: 144. 二叉树的前序遍历 https://leetcode-cn.com/problems/binary-tree-preorder-traversal/ 94. 二叉树的中序遍历 https://leetcode-cn.com/problems/binary-tree-inorder-traversal/ 145. 二叉树的后序遍历 https://leetcode-cn.com/problems/binary-t原创 2021-01-24 21:06:35 · 80 阅读 · 0 评论 -
堆向下调整的实现
我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整算法可以把它调整成一个小堆。向下调整算法有一个前提:左右子树必须是一个堆,才能调整。 思路 以小堆为例,向下调整的实质就是将根节点与比它小的节点交换,逐渐下移,直到其子节点不再比它小为止。由此我们可以进行以下操作: 1、将根节点设为cur 2、进入循环,利用2 * cur + 1 找到左孩子,比较左孩子和右孩子的值,取其中较小的一个child 3、cur与这个child进行比较。若cur > child,则交换两数,并且将cu原创 2020-12-30 22:40:40 · 245 阅读 · 2 评论 -
力扣 622. 设计循环队列
题目来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/design-circular-queue 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。 你的实原创 2020-12-29 20:41:29 · 121 阅读 · 0 评论 -
力扣 剑指 Offer 56 - I. 数组中数字出现的次数
题目来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof 题目要求 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 示例 1: 输入:nums = [4,1,4,6] 输出:[1,6] 或 [6,1] 示例 2: 输入:nums = [1,2,10,4,1,4,3,3]原创 2020-12-06 14:26:12 · 232 阅读 · 0 评论 -
力扣 225. 用队列实现栈
题目来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/implement-stack-using-queues 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top() – 获取栈顶元素 empty() – 返回栈是否为空 注意: 你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。 你所使用的语言也原创 2020-12-28 22:16:31 · 89 阅读 · 0 评论 -
力扣 232. 用栈实现队列
题目来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/implement-queue-using-stacks 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返回队列开头的元素 boolean empty() 如果队列为空,返回原创 2020-12-28 23:01:13 · 91 阅读 · 0 评论 -
双向循环链表的实现
每个节点只有一个后继指针的链表称为“单向链表”。由于单向链表无法寻找到某一节点的前驱节点,执行尾插等操作时需要遍历整个链表,增加了算法的时间复杂度,容易影响整体效率。 为了解决这一问题,引入了双向链表。增加一个指针变量,用于指向每个节点的前驱节点。将双向链表的尾节点的后继指针指向链表的头结点,头结点的前驱指针指向尾节点,就构成了双向循环链表。 C语言实现 定义数据类型、节点和链表结构体 #include <stdio.h> #include <stdlib.h> typedef原创 2020-12-17 21:44:36 · 1007 阅读 · 0 评论 -
动态顺序表的实现
动态顺序表的实现 使用C语言实现动态顺序表。 首先定义顺序表的数据类型的结构: typedef int SLDataType; typedef struct seqList { SLDataType* _data; size_t _size; size_t _capacity; }seqList; 顺序表有3个成员变量。size表示当前表内的数据个数。capacity表示表的容量。由于是动态顺序表,不能直接使用数组存储数据,而是需要申请动态内存,因此设置_data成员变量为指针类型。 主要涉及以下原创 2020-12-06 13:14:35 · 448 阅读 · 0 评论