![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
努力更文的小白
从事Java后端,小白一枚,还请各位前辈多多指教
展开
-
八皇后问题
基本介绍在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。问有多少种摆法。八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。问题分析设八个皇后为xi,分别在第i行( I = 1,2,3,4……,8)。问题的解状态:可原创 2021-05-23 16:27:24 · 10513 阅读 · 1 评论 -
动态规划——01背包问题
基本介绍背包问题:有一个背包,容量为4磅,现有如下物品1)要求达到的目标为装入的背包的总价值最大,并且重量不超出。2)要求装入的物品不能重复分析背包问题主要指一个给定容量的背包,若干具有一定价值和重量的物品,如何选择物品放入背包使得物品放入背包的价值最大,其中又分为01背包和完全背包(完全背包指的是:每种物品都有无限件可用)。而01背包指的是每个物品最多放一个,并且完全背包可以转化为01背包问题。算法的主要思想:利用动态规划来解决,每次遍历的第i个物品,根据w[i]和v[i]来确定是否需要将该原创 2021-05-22 15:55:06 · 876 阅读 · 0 评论 -
基数排序
基本介绍基数排序属于分配式排序,又称为“桶子法”,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。基数排序是属于稳定性排序,基数排序法是效率高的稳定性排序法。是桶排序的扩展。基数排序是1887年赫尔曼.何乐礼发明的,它是这样是实现的:将整数按位数分割成不同的数字,然后按每个位数分别比较。基本思想将所有的待比较数值同一为不同的数位长度,数位较短的数前面补零,然后,从最低位开始,依次进行依次排序,这样最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。转载 2021-05-04 21:47:11 · 50 阅读 · 0 评论 -
归并排序
基本介绍归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分成一些小问题然后递归求解,而治的阶段则将分的阶段得到的各答案“修补”在一起,即分而治之)。基本思想再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],合并相邻有序子序列示意图如下:应用实例归并排序的代码演示如下://分+合方法public static转载 2021-05-04 20:05:47 · 51 阅读 · 0 评论 -
快速排序
基本介绍快速排序是对冒泡排序的一种改进,基本思想是:通过一趟排序将排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分的数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。排序示意图应用实例要求:对[-9,78,0,23,-567,70]进行从小打到的排序,要求使用快速排序。如果取消左右递归,结果是:-9,-567,0,23,78,70如果取消右递归,结果是:-567,-9,0,23,78,70如果取消左递归,结原创 2021-05-04 18:33:39 · 74 阅读 · 0 评论 -
希尔排序
基本介绍希尔排序是希尔于1959年提出的一种排序算法,希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。基本思想希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,魅族包含的关键词越来越多,当增量减少至1时,整个文件恰被分组成一组,算法终止。希尔排序算法示意图如下:应用实例希尔排序对有序序列在插入时采用交换方法,代码演示如下:// 希尔排序时, 对有序序列在插入时采用交换法, // 思路(算法) ===>原创 2021-05-04 16:26:56 · 154 阅读 · 0 评论 -
插入排序
基本介绍插入排序属于内部排序,是对于欲排序的元素以插入的方式找到该元素的适当位置,已达到排序的目的。排序思想插入排序的基本思想是:把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次从有序表的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。插入排序的思路图如下:代码实现如下,时间复杂度为O(N^2)//插入排序public static void insertSort原创 2021-05-03 14:31:51 · 57 阅读 · 0 评论 -
选择排序
基本介绍选择排序也属于内部排序,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。排序思想选择排序也是一种简单的排序方法,它的基本思想:第一次从arr[0]-arr[n-1]中选取最小值,与arr[0]进行交换,第二次从arr[1]-arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]-arr[n-1]中选取最小值,与arr[2]交换,…,第i次从arr[i-1]-arr[n-1]中选取最小值,与arr[i-1]交换,…,第n-1次从arr[n-2]-a原创 2021-05-03 13:36:53 · 43 阅读 · 0 评论 -
冒泡排序
基本介绍冒泡排序的基本思想就是:通过对待排序序列从前往后(下标较小的元素开始),依次比较相邻的元素,若发现逆序则进行交换,使得值较大的元素逐渐从前移到后面,就像水底的气泡一样逐渐向上冒。优化因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换,从而减少不必要的比较。冒泡排序的演示如下:一共要进行数组大小-1次大的循环。每一趟排序的次数在逐渐的减少如果我们发现在某一趟的排序中,没有发生一次交换原创 2021-05-03 13:14:58 · 153 阅读 · 0 评论 -
递归
概念简单的说,递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂的问题,同事让代码变得简洁。递归调用机制打印问题使用图解方式说明了递归的调用机制,如下图所示:代码演示如下:public class RecursionTest { public static void main(String[] args) { // TODO Auto-generated method stub //通过打印问题,回顾递归调用机制 test(4); //int原创 2021-04-17 23:53:47 · 96 阅读 · 0 评论 -
栈
栈基本介绍栈的英文为stack,是一个先进后出(FILO)的有序列表。栈时限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表,允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom).根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。出栈(Pop)和入栈(Push)的操作图解如下所示应用场景子程序的调用:在跳往子程序之前,会先将下一个指令的地址原创 2021-04-15 23:38:13 · 156 阅读 · 0 评论 -
单链表
单链表介绍链表是有序的列表,但是它在内存中存储如下:链表是以节点的方式存储,是链式存储每个节点包含data域,next域:指向下一个节点链表的各个节点不一定是连续存储的链表分带头结点的链表和没有带头节点的链表,根据实际的需求来确定,单链表(带头结点)逻辑结构示意图如下应用实例使用带头节点的单向链表实现——水浒传英雄排行榜管理完成对英雄人物进行增删改查操作。1.第一种方法在添加英雄时,直接添加到链表的尾部,思路分析示意图如下:2.第二种方式在添加英雄时,根据排名将英雄插入到指定位置原创 2021-03-31 00:08:11 · 109 阅读 · 0 评论 -
稀疏数组
稀疏数组需求编写的五子棋程序中,有存盘退出和续上盘的功能,示意图如下。分析问题:因为该二维数组中很多值是默认值0,因此记录了很多没有意义得数据,所以可以使用稀疏数组。基本介绍当一个数组中大部分元素为0.或者为同一个值得数组时,可以使用稀疏数组来保存该数组。稀疏数组得处理方法:1.记录数组一共有几行几列,有多少个不同的值。2.把具有不同的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。应用实例使用稀疏数组,来保存类似前面的二维数组(棋盘、地图等等),把稀疏数组存盘,并且可以原创 2021-03-27 15:06:39 · 68 阅读 · 0 评论