![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 63
不想做咸鱼程序猿
这个作者很懒,什么都没留下…
展开
-
数据结构与算法之快速排序
/** 快速排序* 快速排序是基于划分的思想,就是将一个数组一分为2的目的来进行递归排序的。* 首先快速排序会选取一个基数,也就是比较的枢纽,一般选取数组的第一个或者最后一个数作为基数,这里我们以取第一个元素为例进行分析* 比如存在一个数组int a = {7,3,5,2,9,8,6,1,4,7};* 首先取出index为0的元素7,然后定义两个游标i = 1, j = a.length -1 = 9;* 先拿7和a[j](7)比较,7不大于a[j](7),那么j就往左移动一位(j...原创 2021-07-22 15:23:33 · 145 阅读 · 0 评论 -
数据结构与算法之希尔排序
/** 希尔排序* 希尔排序就是将一个数组按照分段因子来计算出最大分段数,将一个数组根据最大分段数进行分段,在分段元素中进行排序,然后依次减小分段数,直到分段数为1的时候,排序完便结束* 例如数组int[] a = {4,2,8,9,5,7,6,1,3,10,13}; 设置分段因子为3* 那么分段数的公式就为h = 3 * h +1. 可以得到分段数为1,4,13,40...。由于数组的最大长度是 11,最大分段数必须小于数组的长度,* 所以这里的最大分段数为4,针对于数组a,下面来分析...原创 2021-07-21 15:35:10 · 88 阅读 · 0 评论 -
数据结构与算法之归并排序
/** 递归之归并排序* 归并排序就是将两个有序的数组,合到一起,得到一个新的有序数组的过程* 算法分析:首先拿a的第一个元素跟b的第一个元素比较,a的大,那么把b的元素放到新的数组c上* 然后再拿a的第一个元素跟b的第二个元素比较,a的元素小,那么就把a的第一个元素放到数组c上* 依次类推:当组数a的所有元素都被放到c中时,可以直接把b中剩下的元素直接放到c中,反之同理*/public class RecursiveMerge { public static void...原创 2021-07-21 09:55:50 · 65 阅读 · 0 评论 -
数据结构与算法之递归之汉诺塔问题
/** 递归之汉诺塔问题* 汉诺塔问题是有三个柱子,分别是A,B,C然后有N个飞碟在柱子A上,需要将A的飞碟全部移动到C上,并且A柱子上的飞碟从高到低依次变大,* 移动的过程中,大的飞碟不能放在小的飞碟的上面。** 问题的解题思路:首先有N个飞碟,想要把A柱子中的飞碟移动到C上,那么必须先将N-1个飞碟先移动到B上,然后在把N-1个飞碟由B移动到A上* 由此可以得到数学公式f(N) = f(N-1) + 1 + f(N-1); (N>1) 第一个是f(N-1)是将飞碟由A-...原创 2021-07-20 17:49:04 · 119 阅读 · 0 评论 -
数据结构与算法之递归之递归二分法
/** 递归之二分查找* 二分查找就是在一个有序的数据中,先找到中间索引,取到中间索引的元素跟需要查找的元素对比,如果刚好相等,则返回该元素* 如果中间索引的元素大于需要查找的元素,然后再取出开始的节点到中间节点的元素的中间索引的元素进行对比。以次类推* 代码示例如下:*/public class RecursiveDichotomy { public static void main(String[] args) { Scanner sc = new Sca...原创 2021-07-20 16:08:15 · 333 阅读 · 0 评论 -
数据结构与算法之递归之变位字
/** 递归之变位字* 变位字就是一个字符串如"abcde",随意变换abcde的位置,看下一共有多少种情况。* 解题思路:根据数学里面的排列组合的算法,在字母不重复的情况下一个会有n!中排法,* n为字符串的长度,也就是字符串中的字母的个数,根据这个思路,首先定位第一个位置* 的元素,如:"abcde",第一个位置有5种情况:abcde五个字母中任意一个都可以排在* 第一位。第一位定了之后再确定第二位。以次类推,然后知道定位到最后一个字母,然后* 打印出得到的字符串即可* ...原创 2021-07-20 14:26:08 · 93 阅读 · 0 评论 -
数据结构与算法之递归之阶乘
/** 递归之阶乘* 阶乘就是整数n乘以n-1再乘以n-2依次乘下去,直到乘到1为止,用数据表示法就是n!* 阶乘分析:n*(n-1)*(n-2)*...*1通过表达式分析,可以设定一个表达式fun(n) = n*(n-1)*...*1 (n>2);* 那么f(n-1) = (n-1)*(n-2)*...*1;由此可以推出fun(n) = n * fun(n-1);* 所以我们只需要定义好fun函数。* 代码示例如下:*/public class RecursiveFa...原创 2021-07-20 14:11:13 · 647 阅读 · 0 评论 -
数据结构与算法之插入排序
/*** 插入排序* 插入排序就是将后面的元素跟前面的元素进行对比,直到找到第一个比它小的元素,然后将当前的元素插入到这个比它小的元素的后面然后,后面的元素后移一位。* 例如数组:int[] a = new int[]{3,5,1,6,4,7,10,9,6,3,2,8}* 索引为0的元素3,前面没有元素,所以默认其最小,不需要移。第二位元素5,发现前面一位3比5小。所以不需要移位,再后面的1发现前面的5比1大,然后1再跟前面1位* 3比较,发现3比1大,再往前比较,发现没有元素了,然后将...原创 2021-07-20 10:54:12 · 61 阅读 · 0 评论 -
数据结构与算法之选择排序
/*** 选择排序* 选择排序讲究的是每次将最小的数放到数组的最左边(第一位)* 每一次都是将前面的数与需要排序的第一位做比较,如果比第一位要小,那么就交换位置,然后接下来的数再跟第一位做比较。如果再小,做交换,否则就不变。* 例如数组:int[] a = new int[]{3,5,1,6,4,7,10,9,6,3,2,8}* 第一次先将3和5比较,3小于5,位置不变,然后再将3个1比较,3大于1,位置交换,然后再将1和6比较,1比6小位置不变,然后再将1和4比较,位置不变,* 然...原创 2021-07-19 13:33:11 · 75 阅读 · 0 评论 -
数据结构与算法之冒泡排序
/*** 冒泡排序* 冒泡排序讲究的是将左边的元素跟右边的元素做比较,如果左边的元素依次右边的元素要大,那么交换位置;否则位置不变,依次这样一直比较,每次比较结果都是将最大的元素放到最右边。* 例如数组int[] a = new int[]{3,5,1,6,4,7,10,9,6,3,2,8}* 首先取出元素3,然后5比较,3比5小,位置不变,然后再拿5和1比较,5比1大,然后交换位置,然后再拿5和6比较,5比6小,位置不变,然后再拿6和4比较,* 6比4大交换位置,然后再拿6和7比较,6...原创 2021-07-19 12:57:25 · 65 阅读 · 0 评论