一、分治策略 “分而治之”,大问题能够拆成相似的小问题,记住这些小问题需要具有相似性。而后将小问题的每个解合成为大问题的解。所以说大问题如何拆,小问题如何合并才是这个算法最主要的一个思想。实际上很多算法如贪心算法,动态规划等等都是要求把大问题拆成小问题。而分治算法的重要一点就是要适用于能够重新把小问 ...
分类:
编程语言 时间:
2019-08-27 23:22:51
阅读次数:
108
题目链接:https://vjudge.net/problem/POJ-2299 题意:给定一个序列,每次只能交换邻近的两个元素,问要交换多少次才能使序列按升序排列。 思路:本质就是求逆序对。我们用归并排序求逆序对,这也是简单的cdq分治。 ...
分类:
编程语言 时间:
2019-08-27 11:06:04
阅读次数:
85
原文引用https://www.dazhuanlan.com/2019/08/26/5d62f77c1b321/ Description题目大意,给你一串每个元素不相同的序列,每次只能相邻的两个元素进行交换,求,最小多少次交换可以使该序列成为上升序列。注意:明白一个规律,一个数x,肯定要和在它左边且... ...
分类:
编程语言 时间:
2019-08-26 10:15:05
阅读次数:
111
稳定性 如果一个排序算法能够保留数组中 重复元素的相对位置 则可以被称为是 稳定 的 稳定的排序算法:插入排序、归并排序 不稳定的排序算法:选择排序、希尔排序、快速排序和堆排序 一般只有在稳定性是必要的情况下,稳定的排序算法才有优势。 各种排序算法的性能特点 | 算法 | 是否稳定 | 是否为原地排 ...
分类:
编程语言 时间:
2019-08-25 20:18:42
阅读次数:
109
归并排序 package algorithm.sort; / @Auther: AaronPi @Date: 2019 5 6 21:32 归并排序 思想:(分治法 用递归来实现)把数组从中间分成两部分,分别排序,再组合在一起 思路很巧妙,需要尤其注意边界条件、判断剩余元素等事项 / public ...
分类:
编程语言 时间:
2019-08-25 14:13:25
阅读次数:
94
快速排序 package algorithm.sort; / 快速排序 思想:类似于归并排序,但是不同于归并排序每次排序寻找一次子数组中点的是,寻找一个更恰当的分区点 @Author 28370 @Date 2019 5 13 / public class QuickSort { public st ...
分类:
编程语言 时间:
2019-08-25 14:06:52
阅读次数:
80
l例题连接:https://www.luogu.org/problem/P1908 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计。最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定义的:对于给定的一段正整数 ...
分类:
其他好文 时间:
2019-08-25 11:37:55
阅读次数:
75
hdu 5884 Sort 题意: n个有序序列的归并排序。每次可以选择不超过k个序列进行合并,合并代价为这些序列的长度和,总的合并代价不能超过T, 问k最小是多少。 解法: 1:首先想到的是二分这个答案k,然后check每个k是否可行 2:对于每个k,总共需要归并n 1个数,每次归并k 1个数 所 ...
分类:
其他好文 时间:
2019-08-22 22:22:33
阅读次数:
117
思路:使用归并排序,每一轮归并后都局部有序,可以利用这个,减少时间复杂度 小和问题 关键代码: java public static int mergeSort(int[] arr, int left, int right) { if (left == right) { return 0; } in ...
分类:
其他好文 时间:
2019-08-22 22:01:00
阅读次数:
94
首先考虑归并排序: 归并排序为什么能相比普通的排序方法,将时间复杂度从O(n^2)提升至O(nlogn)? 最主要的一点是引入了两个有序数组合并的思想,真正提升效率就是在这个地方。 首先我们考虑,如果两个数组无序的话,比如: 如果使用O(n^2)的方法,在这样一个数组中,每一个数都要跟其他的数比较一 ...
分类:
编程语言 时间:
2019-08-22 11:05:07
阅读次数:
98