数据结构与算法
文章平均质量分 62
HW_Coder0501
I'm QXK, from ZJUT.
展开
-
快排算法对结构体数组进行二次排序
现有某代码仓,其中有多种编程语言(languageId,从0-6分别代码C、C++、Java等),每种语言都有若干代码量(codeline),现要求编写代码,按如下规则输出语言和代码量:按代码量从多到少排序输出,若代码量相同,则按编程语言Id由小到大输出。在软件编码中常常遇到这样一个场景,对一个数组按照某种规则进行排序,在这种规则下排序后,如果其中的某些元素满足另一种规则,则按照另一种规则进行二次排序,这时可以利用快排算法来实现该种需求。原创 2024-10-24 22:43:56 · 212 阅读 · 2 评论 -
算法总结-深度优先遍历和广度优先遍历
所以广度优先遍历也叫层序遍历,先遍历第一层(节点 1),再遍历第二层(节点 2,3,4),第三层(5,6,7,8),第四层(9,10)。(1)、我们从根节点1开始深度优先遍历,它相邻的节点有2、3、4,依先遍历节点2,再遍历2的右边节点5,再遍历9,至此便无可遍历的节点。对于每个节点来说,先遍历当前节点,然后把右节点压栈,再压左节点(这样弹栈的时候会先拿到左节点遍历,符合深度优先遍历要求)。广度优先遍历,指的是从图的一个未遍历的节点出发,先遍历这个节点的相邻节点,再依次遍历每个相邻节点的相邻节点。原创 2023-04-11 22:44:59 · 23764 阅读 · 0 评论 -
算法总结-回溯算法
回溯算法也可以叫做回溯搜索法,它是一种搜索方法。回溯是递归的副产品,只要有递归就会有回溯(递归中隐藏着回溯算法)。所以以下讲解中,回溯函数也就是递归函数,指的都是一个函数。原创 2023-03-22 22:01:21 · 742 阅读 · 0 评论 -
算法总结-递归
进一步剖析「递归」,先有「递」再有「归」,「递」的意思是将问题拆解成子问题来解决, 子问题再拆解成子子问题,...,直到被拆解的子问题无需再拆分成更细的子问题(即可以求解)。「归」是说最小的子问题解决了,那么它的上一层子问题也就解决了,上一层的子问题解决了,上上层子问题自然也就解决了,....,直到最开始的问题解决。文字说可能有点抽象,那我们就以阶层 f(6) 为例来看下它的「递」和「归」。最简单的递归函数就是阶层函数,factorial函数存在factorial(n-1),因此是递归函数。原创 2023-03-13 22:48:58 · 180 阅读 · 0 评论 -
算法总结--快慢指针
快慢指针原创 2022-12-21 23:40:39 · 809 阅读 · 0 评论 -
算法总结-单调栈用法
单调栈,是指栈内元素从栈底到栈顶单调递增或单调递减的栈。简单来讲,单调栈=单调 + 栈,它同时满足两个特性:单调性、栈。以单调递增栈来讲解单调栈原理。假设当前元素为x,(1) 若x < 栈顶元素,那就不满足单调递增性,这时将栈中元素y弹出,若此时条件仍然不满足,则继续弹出栈顶元素,直到满足条件,再将x入栈;(2) 若x >= 栈顶元素,满足单调递增性,将x入栈;如此不断重复以上步骤,直到所有满足条件的元素都入栈。以一个具体例子[3, 5, 2, 6, 8]为例:(1)首先将3入栈,此时栈中元素为[3];(2原创 2022-06-06 23:18:33 · 321 阅读 · 0 评论 -
算法总结-UT哈希算法
uthash 是C实现的哈希算法开源代码,它实现了常见的hash操作函数,例如查找、插入、删除等。uthash 采用宏的方式实现hash函数的相关功能,支持C语言的任意数据结构作为key值,甚至可以采用多个值作为key,无论是自定义的struct还是基本数据类型。需要注意的是不同类型的key其操作接口方式略有不同。由于uthash 采用宏的方式实现,所有的实现代码都在uthash.h文件中,因此使用时只需要包含该头文件即可。uthash最常用的无非HASH_FIND_INT、HASH_ADD_INT、HA原创 2022-06-06 00:54:08 · 2240 阅读 · 0 评论 -
算法总结-前缀和问题
前缀和(preSum)是一种常用的、较为高校的预处理方式,相比于暴力解法,能够有效减低查询的时间复杂度。原创 2022-06-05 00:27:28 · 1189 阅读 · 0 评论 -
算法总结-滑窗算法(二)
滑窗算法原创 2022-05-15 15:26:49 · 1444 阅读 · 0 评论 -
C++实现堆排序算法
C++实现堆排序算法一例,所建堆为大堆。#include using namespace std;int arrs[] = { 23, 65, 12, 3, 8, 76, 345, 90, 21, 75, 34, 61 };int arrLen = sizeof(arrs) / sizeof(arrs[0]);class heapsort{ public: void Bu原创 2017-08-05 20:55:24 · 451 阅读 · 0 评论 -
算法总结-滑窗算法(一)
今有问题如下,给定一个整数数组,计算长度为‘k’的连续子数组的最大总和。输入:arr[] = {100, 200, 300, 400}; k = 2;输出:700解释:300 + 400 = 700这是一道简单的题目,用暴力法也可以直接解答出来,但今天我们要讨论的是滑窗算法,所以不对暴力解法作太多解答。但为了方便对比,仍然给出暴力解法的答案。暴力法int len = 4;for (int i = 0; i < len - 1; i++) { ...原创 2021-11-30 21:20:14 · 2348 阅读 · 2 评论 -
算法总结-二分查找算法
二分查找也称折半查找(Binary Search),是一种效率较高的查找方法。该算法要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。如果一个序列是无序的或者是链表,那么该序列就不能使用二分查找。1、二分查找算法原理二分查找算法原理如下:(1)若待查序列为空,则返回-1,并退出算法;(2)若待查序列不为空,则将它的中间元素与目标数值进行比较,判断是否相等;(3)若相等,则返回中间元素索引,并退出算法;此时已查找成功。(4)若不相等,则比较中间元素与目标数值的大小;原创 2021-11-15 21:38:13 · 3651 阅读 · 0 评论 -
leetcode编程题:合并两个有序链表
难度:简单输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4限制:0 <= 链表长度 <= 1000题解如下:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct List原创 2021-07-23 12:29:02 · 236 阅读 · 1 评论 -
单链表反转
参考http://blog.csdn.net/feliciafay/article/details/6841115。单链表的反转有多种方法,这里实现我认为最容易理解,效率也颇高的一种,即用三个指向不同结点的指针来完成链表逆置。算法代码实现如下:void reverseLinkList(LinkList *list) { LinkList p, q, r; p = *list; q原创 2017-12-29 15:48:26 · 571 阅读 · 0 评论 -
删除单链表中指针q指向的结点
题目:有一个非空单链表list,每个结点中存放一个整型数据。 指针q指向链表中某一个结点,编写函数delLink,删除q指向的结点。链表定义如下:typedef struct node{ElemType data; //数据域struct node *next; //指针域}LNode, *LinkList;分析:原创 2017-12-28 21:50:12 · 4070 阅读 · 3 评论 -
编程实现两个有序单链表的合并
实现两个单链表的合并就是将多个原链表的结点进行重新组合排列,重组成一个新的链表。可以采用下面算法实现,这里list1和list2都是按值递增的序列。LinkList MergeList(LinkList list1, LinkList list2) { LinkList list3; LinkList p = list1, q = list2; LinkList r; if (原创 2017-12-29 14:21:15 · 4555 阅读 · 0 评论