算法
刘荣浩
And your bird can sing.
展开
-
选择排序
选择排序的思路是,输入n个数,存储在下标从0到n-1。第一次,是从下标1到n-1的数中寻找比下标i=0的数小的,有则互换,无则不便;然后再从下标从2到n-1的数中,寻找数与下标i=1的数比较,得出第二小的,以此类推。代码如下:#include <iostream>const int maxn = 1000+10;int arr[maxn];using namespace std;int main原创 2016-04-01 00:12:58 · 180 阅读 · 0 评论 -
最大连续子序列和
#include #include #include using namespace std;int one(int A[], int n){ int MaxSum = 0; for(int i=0; i<n; i++){ int ThisSum = A[i]; for(int j=i+1; j<n; j++){ ThisSum += A[j]; if(This原创 2016-09-22 13:21:43 · 272 阅读 · 0 评论 -
关于扩展欧几里得算法的一些资料
https://zh.wikipedia.org/wiki/%E6%89%A9%E5%B1%95%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E7%AE%97%E6%B3%95(维基百科)http://m.blog.csdn.net/article/details?id=50695810转载 2016-08-07 10:46:27 · 218 阅读 · 0 评论 -
01背包的理解,二维数组化一维数组的理解(附hdu2602 Bone Collector)
01背包问题:有n个物品和一个容量为v的背包,用val[i]表示第i个物品的价值,用vol[i]表示第i个物品的体积,那么,如何使背包里装的物品的总价值最大呢?贪心是不行的,举个反例:n=3, v=100 val[i] vol[i] 80 60 50 50 50 50按照val[i]/vol[i]比值从大到小贪心,那么会得到错误答案80,但是正确答案是100动态规划的原创 2016-07-30 16:41:00 · 3561 阅读 · 0 评论 -
最小生成树和prim算法
最小生成树:在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) 代表此边的权重,若存在 T 为 E 的子集(即)且为无循环图,使得 w(T) 最小,则此 T 为 G 的最小生成树。 最小生成树其实是最小权重生成树的简称 (以上来源百度百科)简单的说就是如何从一个带权图中抽出一棵生成树,使得边权值和最小,这棵生成树就叫做最小生原创 2016-07-19 15:10:19 · 482 阅读 · 0 评论 -
floodfill算法
floodfill算法先找到一个点,以这个点向周围填充或发散,将同一连通的区域或图染上同一种颜色。 这个算法可以看这里:http://lodev.org/cgtutor/floodfill.html#8-Way_Method_With_Stack在无向图中求连通分量:输入:第一行包括n和m,代表n个点,m条边11 100 10 21 21 32 34 54 67 88 98原创 2016-07-19 09:13:22 · 609 阅读 · 0 评论 -
二分查找(入门)
二分查找(渣新入门)二分的写法参考了(http://blog.csdn.net/int64ago/article/details/7425727)下面部分粘贴该博主的博客:我总结的二分无非就4种情况:YES_LEFT、YES_RIGHT、NO_LEFT、NO_RIGHT,分别代表:能找到且返回最左边的数的位置(如查找4的时候返回位置3)、能找到且返回最右边的数的位置(如查找4的时候返回位置4)、不能原创 2016-02-26 12:00:30 · 356 阅读 · 0 评论 -
快速排序
快速排序是一种分区间交换排序的方法,基本思路是,在数组中确定一个对比值,一般为区间中的第一个,然后初始定义first=0和 last=n-1,将大于对比值的数放在右边,小于的放在左边,然后可以利用递归把左右区间再次进行上面的操作。 如下图: 开始以第一个数28为关键字,那么: 第二行;在第一行中,50大于28,–last; 然后20小于28,将20移到第一行中first的位置,即a原创 2016-04-03 16:48:02 · 194 阅读 · 0 评论 -
希尔排序
希尔排序,又称作”缩小增量法排序“,思路是不断把待排序的数组记录按间隔值(然后按下标)分成若干个小组,然后对同一个小组进行排序。设间隔值d(j-i=d),那么有1#include <iostream>#include <algorithm>#include <stdio.h>const int maxn = 1000+10;int arr[maxn];using namespace std;v原创 2016-04-03 01:15:32 · 232 阅读 · 0 评论 -
拆半插入排序
参考直接插入排序,用二分优化了查找的时间。直接贴代码了#include <stdio.h>#include <iostream>#include <string.h>const int maxn = 1000+10;int arr[maxn];using namespace std;void InsertSort(int arr[], int n){ int low, high,原创 2016-04-01 14:47:58 · 345 阅读 · 0 评论 -
直接插入排序
直接插入排序,名字怎么感觉不对啊,是对输入的一个无序的数组进行排序; 排序过程示意: 思路是找到适合的位置后,把之后的数组元素后移,后移的小技巧参考代码。代码如下:#include <stdio.h>#include <iostream>#include <string.h>const int maxn = 1000+10;int arr[maxn];using namespace原创 2016-04-01 14:18:57 · 229 阅读 · 0 评论 -
冒泡排序
冒泡排序,设输入n个数,存储在数组中,是把相邻两个元素进行大小比较,若按从小到大排序,即为每一轮排序把小的放前面,大的放后面,总共要进行n-1轮。下面是代码:#include <iostream>const int maxn = 1000+10;int arr[maxn];using namespace std;int main(){ int n; while(cin>>n){原创 2016-03-31 23:55:31 · 205 阅读 · 0 评论 -
KMP算法
占坑。。。原创 2017-03-18 01:45:40 · 200 阅读 · 0 评论