![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
十七天
这个作者很懒,什么都没留下…
展开
-
弗洛伊德算法
弗洛伊德算法:计算各个顶点之间的最短距离如果要计算ij之间的最短路径,i可以直接到j,也可以经过任意一个顶点到j,所以dis[i][j] = min{dis[i][j], dis[i][k] + dis[k][j]},而dis[i][k]也可以是i经过其他节点再到k产生的最短路径,dis[k][j]同样public class Floyd { public static void main(String[] args) { int[][] weight = new int[.原创 2021-05-27 15:51:18 · 329 阅读 · 0 评论 -
迪杰斯特拉算法
迪杰斯特拉算法:从出发顶点到其他顶点的最短路径。基于已经求出的最短路径,求出更远顶点的最短路径,用dis[j]表示从出发顶点到顶点j的距离,weight[k][j]表示从顶点k到顶点j的距离,那么即dis[j] = min{dis[j], dis[k] + weight[k][j]}。public class Dijkstra { public static void main(String[] args) { Dijkstra d = new Dijkstra();原创 2021-05-27 15:20:54 · 150 阅读 · 0 评论 -
克鲁斯卡尔(Kruskal)算法
1)克鲁斯卡尔(Kruskal)算法, 是用来求加权连通图的最小生成树的算法。2)基本思想: 按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路3)具体做法: 首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止。public class Kruskal { private static final int INF = Integer .MAX_VALUE; public static vo..原创 2021-05-27 15:10:35 · 170 阅读 · 0 评论 -
01背包问题
/** * * @param value 物品的价值 * @param volume 物品的体积 * @param capacity 背包的容量 */ public void kanpSack(int[] value, int[] volume, int capacity){ //res[i][j]表示第i个物品放入容量为j的背包中 int[][] res = new int[value.length + ...原创 2021-05-25 21:12:49 · 32 阅读 · 0 评论 -
堆排序
思想:把待排序的序列构造成大顶堆(父节点的值总是大于子节点的值),根节点就是最大值,把最大值和末尾元素交换,继续把除末尾元素之外的元素构造成大顶堆,并把根节点和倒数第二个元素互换,直到序列有序 public void sort(int[] arr){ for (int i = arr.length - 1; i > 0; i--){ buildHeap(arr,i); int temp = arr[0];原创 2021-05-17 20:49:42 · 39 阅读 · 0 评论 -
插值查找
插值查找类似于二分查找,只是把mid改为自适应的:mid = left + (right - left) * (val - arr[low]) * (arr[high] - arr[low]);插值查找注意事项:1)对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找,速度较快.2)关键字分布不均匀的情况下,该方法不一定比折半查找要好 public int search(int[] arr, int val){ int left = 0; in...原创 2021-04-27 16:24:45 · 49 阅读 · 0 评论 -
基数排序
我们先按个位排,再根据十位数排,直到所有元素有序。有10个桶,分别用来存放某一位上数字为0-9的元素。找到数组中的最大值,它的位数决定了外循环次数。把各个元素按照个位数放入对应的桶里,并用一个count[]记录每个桶里放了几个元素,全部放完以后,把元素按顺序取出,(从第0个桶到第9个桶,每个桶里先放进去的先取出来),放到原数组里;再根据十位数重复上面的过程,重复的次数由最大值的位数决定,循环结束以后数组有序。public void sort(int[] arr){ int le..原创 2021-04-25 13:14:48 · 43 阅读 · 0 评论 -
归并排序
采用分治思想,先递归分解数组,再合并数组public void merge_sort(int[] arr, int[] temp, int start, int end){ if (start == end){ return; } int mid = start + (end - start) / 2; merge_sort(arr,temp,start,mid); merge_sort(arr,t原创 2021-04-22 09:07:11 · 34 阅读 · 0 评论 -
快速排序
快速排序的思想:找一个基准数,对数组进行排序,使基准数的左边的数都小于等于它,而右边的数都大于等于它,再对左右两部分递归地进行这个过程。若以第一个数作为基准数,分别从两端开始探测,先从右往左找一个比基数小的数,再从左往右找一个比基数大的数,然后交换,当左右指针相等时,循环结束,此时两个指针所指向的数一定是小于等于基数的(因为先移动右指针,右指针停下要么是找到了比基数小的数,要么就是碰到了左指针,若左指针没有移动过,则指向的是基数,如果移动过,那就是从右指针交换过来的比基数小的数),所以把基数和这个数交换原创 2021-04-18 14:33:39 · 45 阅读 · 0 评论 -
希尔排序
希尔排序:把序列按下标的一定增量分组,对每组使用直接插入排序算法排序; 随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个序列被分成一组,算法便终止public void shell(int[] arr){ int n = arr.length / 2; while (n != 0){ for (int j = n;j < arr.length; j++){ int temp = arr[j]原创 2021-04-15 19:43:31 · 38 阅读 · 0 评论 -
插入排序
插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素, 把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。public void select(int[] nums){ for (int i = 1; i < nums.length; i++){ int tem原创 2021-04-15 19:41:49 · 36 阅读 · 0 评论 -
选择排序
选择排序(select soring)的基本思想是:第1次从 arr[]~arr[n-1]中选取最小值,与arr[0]交换, 第二次从arr[1]~arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]-arr[n-1]中选取最小值,与arr[2]交换,.第i次从arr[i-1]~an[n-1]中选取最小值, 与arr[i-1]交换, ..第n-1次从arr[n-2]~ arr[n-1]中选取最小值,与arr{n-2]交换,总共通过n-1次,得到一个按排从小到大排列的有序序列。publ原创 2021-04-15 19:40:33 · 39 阅读 · 0 评论 -
冒泡排序
冒泡排序(Bubble Sorting) 的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始) , 依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部。经过一轮排序,数组中最大的元素位于数组的最后,经过两轮排序,数组中第二大的元素位于数组倒数第二个位置,依次类推,经过 数组长度-1 次排序,数组排序完成。优化:如果发现有一趟排序没有交换,说明序列已经有序。public void sort(int[] arr){ for (int i = 0; i..原创 2021-04-15 19:15:50 · 35 阅读 · 0 评论 -
PTA 最大子列和变种问题
问题描述:对于给定的整数序列,对于每个测试用例,在一行中输出最大的和,以及最大子序列的第一个和最后一个数字。数字之间必须用一个空格隔开,但行尾不能有多余的空格。如果最大子序列不是唯一的,则输出索引i和j最小的子序列(如示例所示)。如果所有的K个数都是负的,那么它的最大和被定义为0,你应该输出整个序列的第一个和最后一个数。思路:public class MaxSubSeqTest { public static void main(String[] args) { Scann原创 2021-03-24 09:42:59 · 104 阅读 · 0 评论 -
有一个01矩阵,通过改变某些位置的数字,使矩阵上下左右对称
有一个01矩阵,通过改变某些位置的数字(0变成1或1变成0),使矩阵上下左右对称。思路:假设矩阵是n行m列的,int[][] arr = new int[n][m],若矩阵上下左右都对称,对于矩阵中的某个元素arr[i][j]来说,应该和与它对称的位置上的元素arr[i][ m - 1 - j],arr[n -1 -i][j]都相等,而arr[i][ m - 1 - j],arr[n -1 -i][j]又都与arr[n - 1 - i][m - 1 -j]对称(不清楚就画一下矩阵),所以这四个元素都应该原创 2021-03-23 15:30:16 · 767 阅读 · 1 评论 -
已知一个序列的前若干位,根据规律填写后面的若干位。
现在告诉你某个序列中仅包含1-n之间的所有整数,给出你这个序列的前m位,后面的数字则遵循以下规则生成:每个位置会从1-n中选择一个之前出现次数最少的数字,如果有若干个出现次数最少的数字,则选择最小的数字。例如仅包含1-3的序列中前4位数1 2 2 3,则生成的后4位是1 3 1 2.思路:创建一个长度为n的数组int[] counts,记录序列中的数字出现的次数,由于数组下标从0开始,所以每接收到一个数据data,counts[data - 1]++。数据输入完成后,遍历counts数组,记录数组中最小原创 2021-03-23 15:01:36 · 269 阅读 · 0 评论 -
最大子列和问题
给定N个整数的序列,求所有连续子列和中的最大值,若该值小于0,则返回0。public class MaxSubSeqSum { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int k = scan.nextInt(); int[] arr = new int[k]; for(int i = 0; i < k;原创 2021-03-23 14:44:22 · 49 阅读 · 0 评论 -
输出1000以内的质数
/*100000以内的质数:从2到n-1都不能被n整除最小的质数是2*/方法一:class PrimeNum{ public static void main(String[] args) { /* for(int i = 2; i <= 100;i++ ){ boolean isFlag = true;//表示i是否被j除尽 for (int j =2;j <= i-1 ...原创 2021-03-12 13:16:24 · 1546 阅读 · 0 评论