![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 77
1162210866
就这样吧
展开
-
选择排序学习
概念 前面学习了冒泡排序,其实我一直将冒泡和选择搞混淆,因为冒泡也是每次循环找到最大或者最小的元素,但是冒泡多了一步交换。选择排序就不同,每次循环找到最大值或者最小值,最后才将其放到队尾或者队首。 说这这里,选择排序的概念就很清楚了,有两个循环,外循环遍历所有的元素,内循环遍历找到最大值,内循环完成后,将当前循环的最大值移动到队尾。外循环完成后,排序也就完成了。示意图如下:代码 代码来说就比较简单了,甚至比冒泡排序还要简单。如下:public static void selectionSo原创 2021-08-29 02:12:33 · 94 阅读 · 0 评论 -
冒泡排序学习
概念 冒泡排序是非常基础的排序算法之一,也很容易理解。过程简单来说就是:每次比较相邻的两个元素,如果前一个元素大于后一个元素就交换这两个元素的位置(不一定大于,小于也可以)。一直重复这个操作,知道数组中所有的元素排序正确后,即所有的元素都不需要交换位置。 也可以看看动图去理解。动图这里放上一个链接,菜鸟教程的:菜鸟教程冒泡排序实现 实现起来也是比较简单的:代码如下:public static void bubbleSort1(int[] arr) { int length = arr原创 2021-08-17 23:54:00 · 102 阅读 · 0 评论 -
二分算法
蓝桥杯结束了。对于结果现在也看开了。以前认为比赛看重过程就是个笑话,现在突然懂了,比赛果然还是过程重要。这里也将这些日子的一些想法和学习的一些比较经典的算法以及题型再次重温一遍。毕竟过程还是重要的。 下面先讲一个查询的算法。二分算法。 二分算法主要是利用有序数组排序的特点来进行查找元素,通过每次中间指针和查找元素的大小比较,来判断在数组的左边还是右边进行下一步查找。主要是利用...原创 2018-04-01 20:46:00 · 130 阅读 · 0 评论 -
斐波那契数列
其实这个斐波那契数列比较简单,但是这里还是要写一下,主要是弄懂递归和递推的区别。以及在一些情况下为什么递归比递推慢。 下面就分别用递归和递推来实现斐波那契数列。public class demo1 { //这里是递推的方法。 public static int fib(int n) { //int fib[];//数组只是声明一个引用变量,不能直接使用,还要初始化...原创 2018-04-01 21:18:00 · 92 阅读 · 0 评论 -
Dijkstra的双栈算术表达式求值算法
这次来复习一下Dijkstra的双栈算术表达式求值算法,其实这就是一个计算器的实现,但是这里用到了不一样的算法,同时复习了栈。 主体思想就是将每次输入的字符和数字分别存储在两个栈中。每遇到一个单次结束符号(就是“)”),边将运算符号栈中的字符弹出一个,在将数字栈中的数字弹出两个,并进行运算,将最后的结果在压入数字栈中。在进行下次的运算。以此类推。 整体的算法思路比较清晰,但是...原创 2018-04-02 21:46:00 · 215 阅读 · 0 评论 -
选择排序
讲一讲经典的排序算法,选择排序算法。 选择排序的大致思想比较简单,就是在数组中每次循环比较的时候将最小的元素和当次循环的第一个元素交换位置,循环结束后,所有的元素便完成排序。 选择排序有两个特点:运行时间和输入无关。移动元素的次数最小。 运行时间和输入无关:无论数据是否已经排序成功,选择排序都是要进行N²/2的比较。因为不会利用上一次的比较结果,所以选择排序在数据较大的情...原创 2018-04-02 22:22:00 · 82 阅读 · 0 评论 -
棋盘覆盖问题
今天来讲讲棋盘覆盖,其实是算法课讲到了这一问题,也顺便复习一下。 棋盘覆盖问题其实就是将含有特殊方格且具有一定规格的棋盘用各种L型方格覆盖,这个问题用分治和递归解决起来比较简单。下面就是一个例子的解决答案。(棋盘的大小为4*4,特殊方格为(1,1)) 下面详细讲一下棋盘覆盖问题的具体细节。此问题的棋盘具有一定的特殊性,为2的n次方(因为只有这样才可以保证可以完美解决问题)。...原创 2018-04-07 18:49:00 · 208 阅读 · 0 评论 -
矩阵连乘问题
今天算法课讲到了矩阵连乘问题,所以再来复习一下。 讲到矩阵连乘问题就不得不讲一讲动态规划。动态规划就是将问题分解为若干个子问题,先将子问题求解,最后在从子问题的解中得到原问题的解。这样看来动态规划好像和分治法相差无几,但是两者还是有着一些差别的,分治法分解的子问题中,子问题互相之间是没有联系的,就是子问题是互相独立的,但是动态规划则不同,子问题之间是有联系...原创 2018-04-09 21:57:00 · 455 阅读 · 0 评论 -
递归分治策略
在前面的随笔中其实谈到了一些递归分治的算法,也以为自己写上去了,今天在看到没有写。下面就来补上。 递归分治是算法中比较重要的思想。在之前也聊到了递归和递推的区别。递归这里就不再详细讲述了。下面讲一讲分治。分治其实很简单,就是将一个比较大的问题分解为很多的小问题,解决小问题的最优解比解决大问题的最优解要简单的多,很多的小问题的最优解就组成了大问题的最优解。从这里也可以发现,递归和分...原创 2018-04-10 22:09:00 · 169 阅读 · 0 评论 -
插入排序
好长时间没有写了,今天来复习一下插入排序。 插入排序。算法的大致思想和字面意思差不多,就是将无序的数组中插入到有序的数组中,当无序的数组为空时,排序就完成了。以上就是算法的大概思路,下面详细说一下。插入排序将要排序的数组分为两个“数组”,左边的数组为有序的数组,右边的为无序的数组。(两者相反也可)将右边数组的元素依次放入左边数组中的有序位置,等到右边数组的元素放完后,整个排序也就...原创 2018-04-15 22:00:00 · 97 阅读 · 0 评论 -
背包问题(贪心算法)
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法还是比较好理解的一个算法,以前我也是这样认为的,感觉贪心就是每一步都做到最优解就可以了,但是后来结合问题发现自己的理解存在着一些问题。贪心算法比较经典的题目之一就是单源最短路径问题,这个问题在一些步骤上面我想了很久,有些细...原创 2018-05-01 22:46:00 · 32787 阅读 · 0 评论 -
N皇后问题(递归回溯)
这个和回溯的思想有些不一样,回溯的思想是算法的主体还要有函数限制,将后面的解的一些错误的子树直接去掉,这个算法没有做到这一步,算法的实现还是有很大的提升空间,大概在求16皇后问题的时候需要100秒就是算法的大概极限了(这个也是在网上看到的),自己还是一个菜鸟,现在就是想一想。因为自己一开始想的是一个二维数组,这个也是大家容易想到的,但是后来发现,解的形式和数组的下标有关,干脆将二维数组变为了一维数组,将皇后所在的列变为数组的下标。翻译为代码语言就是,皇后所在的位置的差的绝对值等于皇后的列的差的绝对值。原创 2018-05-02 23:10:00 · 436 阅读 · 0 评论 -
快速排序
这次来复习排序,讲一讲快速排序。 要说应用最广的排序大概就是快速排序了,因为它有着许多优点。实现简单,需要的辅助空间少,需要的时间比其他的排序少。所以,快速排序是一个必须要了解的排序算法。但是它也有着一些缺点,快速排序算法非常的脆弱,这一点下面也会提到。 快速排序的基本思路就是将排序的元素分为两组,在将两组分别再次排序,两个子数组排序完成后整个数组的排序也就完成了。大体的思路...原创 2018-05-06 22:01:00 · 134 阅读 · 0 评论 -
分支限界法解决01背包问题
分支限界法和之前讲的回溯法有一点相似,两者都是在问题的解的空间上搜索问题的解。但是两者还是有一些区别的,回溯法是求解在解的空间中的满足的所有解,分支限界法则是求解一个最大解或最小解。这样,两者在解这一方面还是有一些不同的。之前回溯法讲了N后问题,这个问题也是对于这有多个解,但是今天讲的01背包问题是只有一个解的。下面就讲讲分支限界法的基本思想。 分支限界法常以广度优先或以最小消耗...原创 2018-05-23 10:42:00 · 16617 阅读 · 0 评论