数据结构
文章平均质量分 62
数据结构
闻风听雨_
这个作者很懒,什么都没留下…
展开
-
最大子数组、最长公共子序列、0-1背包、编辑距离等若干算法实现
最大子数组问题 public static int getMaxSubArray(int[] nums,int left,int right){ //动态规划解法 int[] D = new int[nums.length]; //D[i]表示以第i个元素开头的最大的子数组和 D[nums.length-1] = nums[nums.length-1]; int res = D[nums.length - 1]; //计算的同时求最原创 2022-03-09 20:52:50 · 325 阅读 · 0 评论 -
已知x的补码,求-x的补码
两种情况当x为正数举个例子:设[x]补 = 01010,则有:∵ [x]补 = 01010;∴ [x]原 = 01010;∴ [-x]原 = 11010;∴ [-x]补 = 10110;对比[x]补与[-x]补的每一位可以发现,把[x]补连同符号位的每一位都取反再加1即可得到[-x]补当x为负数还是举个例子:设[x]补 = 11011,则有 ∵ [x]补 = 11011; ∴ [x]原 = 10101; ∴ [-x]原 = 00101; ∴ [-x]补 = 00101;可以发原创 2021-09-09 17:24:41 · 22912 阅读 · 7 评论 -
堆排序、归并排序、快速排序
堆排序堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序是基于堆这种数据结构实现的,什么是堆呢?首先,堆是一棵完全二叉树,其次根据性质不同可以分为以下两种:大根(顶)堆:每个结点的值均大于等于它的两个孩子结点的值小根(顶)堆:每个结点的值均小于等于它的两个孩子结点的值显然,大根堆的堆顶具有整个堆中最大的结点值,小根堆的堆顶具有整个堆中最小的结点值。下面我原创 2021-08-15 21:20:08 · 826 阅读 · 0 评论 -
如何不使用额外变量交换两个数的值
代码a = a^bb = a^ba = a^b没错就是上面这三行简单的代码,下面简单说一下原理。原理首先需要了解异或^的运算规则。这是一个二进制运算符,一位二进制下有一下几种情况:0^1 = 10^0 = 01^0 = 11^1 = 0简单来说就是一句话:相同为0不同为1,那么一个数和自身作异或运算将等于0 另外异或还有两个很重要的性质:交换律和结合律:a^b = b^a,a^b^c = a^(b^c),这两个性质后面会用到。然后分析一下上面三行代码的运算过程。第一行a =原创 2021-08-14 16:38:14 · 586 阅读 · 0 评论 -
迪杰斯特拉算法求图的最短路径(Java)
本文所有代码基于Java实现图的存储和创建一文所实现的带权无向图迪杰斯特拉算法迪杰斯特拉算法(Dijkstra) 是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。Dijkstra算法设置一个集合S记录已求得最短路径的顶点,初始时把源点v0放入S,集合S每并入一个新顶点vi,原创 2021-08-01 20:21:11 · 919 阅读 · 0 评论 -
Java实现图的广度优先遍历和深度优先遍历
本文所有代码全部基于Java实现图的存储和创建一文所实现的带权无向图。广度优先遍历广度优先搜索(Breadth-First-Search,BFS) 类似于二叉树的层序遍历。基本思想是:首先访问起始顶点v,接着由v出发,依次访问未访问过的邻接顶点w1,w2,…wi,然后依次访问w1,w2,…wi的所有未被访问过的邻接顶点;再从这些访问过的顶点出发,访问他们所有未被访问过的邻接顶点,直至图中所有顶点都被访问过为止。若此时仍有顶点未被访问,则另选图中一个未被访问的顶点作为起始点,重复上述过程,直至所有顶点都原创 2021-07-27 13:48:50 · 639 阅读 · 0 评论 -
Java实现图的存储和创建
带权无向图存储结构存储结构选用邻接表。当一个图为稀疏图时,使用邻接矩阵法显然要浪费大量的存储空间,而图的邻接表法结合了顺序存储和链式存储方法,大大减少了这种不必要的浪费。当然,即使我们所处理的图不是稀疏图,邻接表法也是能够胜任的。图、顶点以及边的代码定义public class graph_t { //邻接表实现的带权无向图 private ArrayList<VNode> vertices; //邻接表 private int vexNum; //顶点原创 2021-07-26 21:56:29 · 1190 阅读 · 5 评论 -
找出无序数组中第k小的元素
思路要找到第k小的元素,可以先将数组排序,再返回第k[-1]个元素即可,这里排序选择效率较高的归并排序具体实现:/*author: QGQdescription: 对于给定的n个元素的数组a[1..n],要求从中找出第k小的元素。datetime: 2021年3月28日 13点37分*/#include <stdio.h>#include <stdlib.h>int length;int *B;原创 2021-03-28 14:35:06 · 1560 阅读 · 0 评论 -
C语言归并排序
废话不多少直接上代码#include <stdio.h>#include <stdlib.h>/*Description: 归并排序Author: QinGQDatetime: 2021年3月8日20点03分 */int Length; //待排序数组长度int *A; //待排序数组int *B;原创 2021-03-09 15:34:27 · 245 阅读 · 0 评论 -
以非递归的方式实现二叉树的三种遍历
二叉树的代码定义//Definition for a binary tree node.public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() { } TreeNode(int val) { this.val = val; } TreeNode(int val, TreeNode left, TreeNode right) {原创 2020-10-26 20:47:01 · 661 阅读 · 2 评论 -
Java实现快速排序算法-Quick Sort
算法简介快速排序(Quick Sort) 是由冒泡排序改进而得的。在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序。如果能通过两个(不相邻)记录的一次交换直接消除多个逆序,则会大大加快排序的虚度。快速排序方法中的一次交换可以消除多个逆序。算法步骤在待排序的n个记录中任取一个记录(通常选取第一个记录)作为枢轴,设其关键字为pivotkey。经过一趟排序后,把所有关键字小于pivotkey的记录交换的前面,把所有大于pivotkey的记录交换到后面,结果将待排序记.原创 2020-10-04 22:01:43 · 296 阅读 · 0 评论