![](https://img-blog.csdnimg.cn/20190918140037908.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法与数据结构
文章平均质量分 59
常见的算法,用java代码实现,有注释,努力去用尽量少的言语去说清问题,同时也是个人笔记!
MrYuShiwen
能够成就别人的人才能称得上是真英雄,愿我们彼此相互成就,成为那个真英雄!
Java开发工程师,后端工程师,努力想成为架构师的小萌新;
写代码和学习新知识是一件非常有趣的事情,它即是个人爱好也是个人职业;
愿我的文章对读者有用,欢迎评论,一起进步!
如果期待更多我的知识分享,请关注我,一起成为那个了不起的人吧!
展开
-
次序选择问题 java代码完整实现 分治法
什么是次序选择:就是需要找出给定序列中第k小元素(其中k大1小于n)。比如当k=3时,我们需要找出该序列中第三小元素。分治法解决次序选择问题:我们可以借用随机主元的快速排序的思维去解决该问题(点击查看本人另一篇博文随机化快速排序:随机化快速排序),与快速排序不同的是,在主元下标等于k时,我们就可以直接退出,不需要再进行剩下的分解问题和合并问题解过程。其时间复杂度的数学期望为O(n),是一个非常高效的算法。比如我们要寻找第4小元素,给定数组为945721683,下面我们对其进行分析:开始——>原创 2020-07-11 10:59:13 · 1984 阅读 · 3 评论 -
快速排序(随机化快速排序 随机主元)java代码(递归实现)分治法(分而治之)
固定主元的快速排序:1.首先选取一个主元(一般取数组的头部或者尾部为主元);2.把其他数与主元比较,如果比主元小,放主元左边,如果比主元大,放主元右边;(这个时候主元左边的数都只是比主元小,左边的数还没有从小到大排好)。3.对主元左边数组段重复1,2步骤;对右边也重复1,2步骤。ps:上述步骤2的具体实现说明(主元以每次选取数组尾端元素为例):1.创建两个指针i,j;i初始值为数组头部元素下标减一,j为数组头部元素下标(i左边存放比主要小的元素,i到j存放比主元大的元素,等到j走到尾端要交换主元素原创 2020-07-10 21:30:13 · 1327 阅读 · 0 评论 -
逆序对(逆序对问题) 分而治之方法(分治法)java代码实现完整版(递归实现)
什么是逆序对:对于一个包含n个整数的数组arr[1…n],如果有i < j,且arr[ i ]>arr[ j ],则称(A[ i] ,A[ j] )为数组arr中的一个逆序对。一般思维:蛮力枚举:即两层for循环遍历每个元素,这样的算法时间复杂度为O(n2).那么我们能否利用分治法去寻找一个更有效的方法去解决问题呢。分治法解决逆序对:我们可以参考归并排序的过程,结合归并排序每次比较排序之后的有序性,在合并的过程中进行统计逆序对的个数,(不太了解分治法和归并排序的读者,可以点击查看我原创 2020-07-09 18:52:13 · 1954 阅读 · 3 评论 -
最大子数组(最大子数组和)分治法 java代码实现(完整版)递归方式实现(分而治之)
什么是最大子数组:子数组:数组中一段连续的序列最大子数组:子数组中各个值相加和最大一般人思维1:蛮举,把数组中每个子数组都计算一遍当然这样的算法效率是低下的一般人思维2:我们在蛮举的时候会发现其实有很多重复计算的地方,所以我们会想到保存上次相加后的结果,但是这样的算法效率也不够高,其时间复杂度为O(n2).接下来我将会介绍用分而治之算法思想去解决问题分而治之解决最大子数组问题:1.什么是分而治之:...原创 2020-07-08 15:55:09 · 1814 阅读 · 0 评论 -
归并排序 (分而治之算法) java代码实现(java完整代码)java递归实现(分而治之)MergeSort(分治法)
归并排序是分而治之算法策略的典型代表之一分而治之算法的思路:分而治之三步骤:分解原问题,解决子问题,合并问题解1.分解原问题:将原问题分解为若干个规模较小,相对独立,与原问题形式相同的子问题。2.解决子问:若子问题规模较小且易于解决时,则直接解。否则,递归地解决各子问题。3.合并:将各子问题的解合并为原问题的解。归并排序:以数组为例,假设数组长度为n1.首先把其拆分n组每组一个,2.然后每相连的两组进行比较,并排序;(第一遍排序之变成了n/2组,每组为2个,当然若n为奇数,则最后一组只有原创 2020-07-07 17:16:38 · 2143 阅读 · 0 评论 -
希尔排序(简单易懂,图文并貌,插入排序)java代码实现
希尔排序是直接插入排序算法的一种更高效的改进版本。希尔排序思想:按照增量d对其进行分组,每组内部分别进行直接插入排序;(如果不太懂直接插入排序的java具体实现方法,可参考本人所写另一篇博文:直接插入排序)一般首先取d等于序列长度的一半,然后以后每次减半,直到增量等于1.下面是本人用ProcessOn所绘制的排序过程图:(以11个数为例进行说明,请大家认真分析此图,耐心一点,写得很详细,看完此图应该会有所收获)java实现代码(有注释):public void toShellSort(in原创 2020-07-06 22:25:05 · 909 阅读 · 4 评论 -
插入排序(直接插入排序)java代码实现(注释详细 简单易懂)
算法思想:以数组为例:每次从未排序的数组中取出一个,与之前排好序的数组逐一比较大小,并插入到适当位置,直到未排序的数组为空。java代码(注释写得比较详细,请认真看代码段的注释):public void toInsertSort(int []arr) { for(int i = 1; i<arr.length;i++) { //i是当前数 for(int j = i-1 ; j>=0;j--) { //j是从i-1开始向前移动,并每次与arr[i]判断大小原创 2020-07-06 16:13:52 · 1480 阅读 · 0 评论 -
选择排序 java实现(言简意赅)
选择排序的思路: 每次都从未排序的序列中找到一个最小(大)的元素,把它放到已排好序的序列尾部; 重复上述过程,直到未排序的序列为空。java代码(从小到大):public void toSelectSort(int []arr) { for(int i = 0 ; i<arr.length-1; i++) { int minIndex = i; //暂且认为当前的arr[i]是arr[i]到arr[length-1] 中最小的 for(int j = i原创 2020-07-04 16:50:15 · 610 阅读 · 0 评论