算法(Java)
jQueryZK
本科在校软件专业学生,正在奔向程序员的道路上
展开
-
算法(Java实现)-图解十大经典排序算法(五)——计数排序、桶排序、基数排序
1、计数排序 1.1计数排序介绍 计数排序:不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。 算法描述: 找出待排序的数组中最大和最小的元素; 统计数组中每个值为i的元素出现的次数,存入数组C的第i项; 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加); 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。 分析:计数排序是一个稳定的排序算法原创 2020-09-14 16:07:48 · 2711 阅读 · 0 评论 -
算法(Java实现)-图解十大经典排序算法(四)——归并排序
1、归并排序 1.1归并排序介绍 归并排序(MERGE-SORT) :是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 说明:可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程 算法描述: 把长度为n的输入序列分成两个长度为n/2原创 2020-09-14 16:06:59 · 2311 阅读 · 0 评论 -
算法(Java实现)-图解十大经典排序算法(三)——选择排序(简单选择排序、堆排序)
1、选择排序 1.1选择排序介绍 选择式排序:是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。 选择排序思想: 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 算法描述: 初始状态:无序区为R[1…n],有序区为空; 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R(i…n)。该趟排序从当前无序区中-选出关键原创 2020-09-14 16:06:17 · 2402 阅读 · 0 评论 -
算法(Java实现)-图解十大经典排序算法(二)——插入排序(直接插入排序、希尔排序)
1、直接插入排序 1.1直接插入排序算法介绍 插入式排序:是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。 直接插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。 比如: 1.2直接插入排序算法的实现 import java.text原创 2020-09-14 16:05:15 · 2345 阅读 · 0 评论 -
算法(Java实现)-图解十大经典排序算法(一)——交换排序(冒泡排序、快速排序)
1、排序算法 排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。 2、排序的分类 2.1按使用内存情况分 内部排序: 指将需要处理的所有数据都加载到内部存储器中进行排序。 外部排序法: 数据量过大,无法全部加载到内存中,需要借助外部存储进行 排序。 2.2按是否为比较类分 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比原创 2020-09-14 16:03:21 · 2330 阅读 · 0 评论 -
算法(Java实现)-常用的查找算法(线性查找、二分查找、插值查找、斐波那契查找)
1、线性查找算法 介绍:线性查找算法就是在待查数据中进行顺序性轮询查找,当存在待查的数据时返回当前数据索引位置,如果不存在则返回不存在表示-1 平均查找长度:1/2(n+i) 计算方式:当前元素找到的概率乘上所匹配的次数 时间复杂度:O(N) 例: 有一个数列: {1, 9, 11, -1, 34, 89} ,判断数列中是否包含11 要求: 如果找到了,就提示找到,并给出下标值。 public class SeqSearch { public static void main(String[] args)原创 2020-09-07 15:42:42 · 3370 阅读 · 0 评论 -
算法(Java实现)-算法的时间复杂度和空间复杂度
1、时间复杂度 1.1度量一个程序(算法)执行时间的两种方法 事后统计的方法 这种方法可行, 但是有两个问题: 一是要想对设计的算法的运行性能进行评测,需要实际运行该程序; 二是所得时间的统计量依赖于计算机的硬件、软件等环境因素, 这种方式,要在同一台计算机的相同状态下运行,才能比较那个算法速度更快。 事前估计的方法 通过分析某个算法的时间复杂度来判断哪个算法更优。因事后统计方法更多的依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。因此人们常常采用事前分析估算的方法。 在编写程序前,依据原创 2020-09-06 14:06:06 · 3865 阅读 · 0 评论 -
算法(Java实现)-汉诺塔问题(递归回溯)
1、汉诺塔问题介绍 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 简单分析要求: 有三根柱子 一次只能移动一个圆盘 小圆盘上不能放比它更大的圆盘 需要按从小盘到大盘的顺序重新摆在另一个盘上 2、思路分析 假设我们先给三根柱子分别命名为A、B、C: 初始的时候盘按从小原创 2020-08-26 20:46:02 · 4843 阅读 · 0 评论 -
算法(Java实现)-求解八皇后问题(回溯算法)
1、八皇后问题介绍 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 2、 八皇后问题算法思路分析 第一个皇后先放第一行第一列 第二个皇后放在第二行第一列、然后判断是否OK,如果不OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适 继续第三个皇后,还是第一列、第二列……直到第8个皇后也能放在一个不冲突的位置原创 2020-08-25 19:31:47 · 4679 阅读 · 0 评论 -
算法(Java实现)-详谈递归(迷宫回溯问题)
1、递归的概念 简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题, 同时可以让代码变得简洁。 2、递归调用的机制 (1)打印问题 看下面代码: public class RecursionTest { public static void main(String[] args) { // TODO Auto-generated method stub //通过打印问题,回顾递归调用机制 test(4); } //打印问题. public s原创 2020-08-25 16:41:26 · 6859 阅读 · 0 评论 -
算法(Java实现)-图解Josephu(约瑟夫)问题
1、Josephu(约瑟夫) 问题描述:设编号为1,2,3,,,,n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列,和最后剩下的那个人。求这个序列和最后那个人的编号。 整体解题思路:用一个不带头节点的单向环形链表来处理该问题。 先构成一个有n个结点的单向环形链表 由k结点起从1开始计数,计到m时,对应结点从链表中删除 被删除的下一个节点又从1开原创 2020-08-15 16:03:58 · 8713 阅读 · 1 评论