
数据结构与算法
阿布哥
这个作者很懒,什么都没留下…
展开
-
关于斐波那契数列的几种解法
#include using namespace std;/*int main(){ cout << "Hello World!" << endl; int a = 0; a = a + 2; cout << a; cout << "运行成功"; return 0;}*/#define MAXN 45#defin原创 2013-08-07 11:15:14 · 621 阅读 · 0 评论 -
七种qsort排序方法
一、对int类型数组排序 int num[100]; Sample: int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } qsort(num,100,sizeof(num[0]),cmp); 二、对char类型数组排序(同int类型) ch转载 2013-08-11 16:53:17 · 556 阅读 · 0 评论 -
动态规划——POJ1163数字三角形问题
#include using namespace std;const int MaxNum = 100;int Num[MaxNum + 10][MaxNum + 10];int MaxSum[MaxNum + 10][MaxNum + 10];int N;int main(){ int i; int j; cin >> N; f原创 2013-08-26 09:20:38 · 573 阅读 · 0 评论 -
求最长的上升子序列
题目:一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N原创 2013-08-26 22:17:39 · 635 阅读 · 0 评论 -
POJ1661——Help Jimmy(关于动态规划)
总结:1.用动态规划解题,关键是要找出"状态"和状态间进行转移的方法(即状态转移过程)2.一般在动态规划的时候所用到的一些数组,也就是用来存储每个状态的最优值。搜索的实现:方式1:递归——剪枝1.整个搜索过程中,最终状态始终不变2.不要考虑明显不能达到最终状态的路径方式2:动态规划目的:1.在搜索过程中,把计算的结果保留下来2.在后面的搜索过程中,努力使用前原创 2013-08-27 16:31:57 · 586 阅读 · 0 评论 -
关于sort算法的总结
sort(数组头指针,数组为指针,比较函数)//需要包含algorithm头文件sort函数的强大功能在于可以给多种数据类型排序。sort可以排列整型数组、字符型数组、浮点型数组,也可以对字符串数组和结构体数组进行排序。#include #include #include using namespace std;//定义一个比较函数//如果排序函数返回a b//那原创 2013-08-09 21:53:22 · 559 阅读 · 0 评论 -
给出前序序列,求后序序列
有一棵树,每个结点存放一个字符。所有的叶子结点都存放着‘#’字符,非叶子结点则不可能存放‘#’字符。非叶子结点都是既有左子树又有右子树。给出该树的先序遍历序列,求其后序遍历序列输入:AB#D##CE###输出: ###DB##E#CA#include using namespace std;//先序遍历得到后序遍历(递归实现)//思想:没输入一个字符判断是否是#,如是则直接原创 2013-08-30 17:09:13 · 1266 阅读 · 0 评论 -
二叉树的先序、中序、后序遍历(删除树有问题)
#include using namespace std;//定义一个树节点struct CharNode{ char data; CharNode *pLeft; CharNode *pRight;};//创建一个树节点CharNode *CreateNode(char ndata){ CharNode *pNode = n原创 2013-08-30 16:37:09 · 644 阅读 · 0 评论 -
STL的几个算法应用
#include #include #include #include #include #include #include #include using namespace std;class LessThan9{ public: bool operator()(int n) { re原创 2013-09-07 16:24:15 · 578 阅读 · 0 评论 -
教你透彻了解红黑树
作者:July、saturnman 2010年12月29日本文参考:Google、算法导论、STL源码剖析、计算机程序设计艺术。推荐阅读:Left-Leaning Red-Black Trees,Dagstuhl Workshop on Data Structures, Wadern, Germany, February, 2008.直接下载:http://www.cs转载 2013-09-25 14:51:23 · 500 阅读 · 0 评论 -
时间复杂度
1. 算法复杂度分为 时间复杂度和空间复杂度。 作用: 时间复杂度是度量算法执行的时间长短;而空间复杂度是度量算法所需存储空间的大小。 2. 一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n)) 分析:随着模块n的增大,算法执行的时间的增长率和f(n)的增长率成正比,所以f(n)越小,算法的时间复杂度越低,算法转载 2013-09-25 19:12:07 · 602 阅读 · 0 评论 -
阿布学排序之堆排序
/** * 需求:堆排序的实现 * 知识储备: * 满二叉树:除叶子结点外的所有结点均有两个子结点,所有叶子结点必须在同一层上。 * 完全二叉树: * 若二叉树的深度为h,除第h层外,其它各层(1~h-1)的节点数都达到最大个数,第h层所有结点都连续集中在最左边。 * 完全二叉树是有满二叉树而引出来的,对于深度为K的,有N个结点的二叉树,当且仅当每一个结点都与深度为K的满二叉树中编号从原创 2014-05-15 17:08:12 · 686 阅读 · 0 评论 -
C中的qsort函数
C中的qsort函数一、简介 原 型: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));功 能: 使用快速排序例程进行排序 参 数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序说明:转载 2013-08-11 17:01:26 · 575 阅读 · 0 评论 -
递归——放苹果
问题:m个苹果,n个盘子,问多少种不同方法?盘子和苹果是没有编号的,即1,2,3和3,2,1算是一种放法算法:1.当n > m:必定有n - m个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响即if(n > m) f(m,m) = f(m,m) 当n a.有至少一个盘子空着,即相当于f(m,n) = f(m, n - 1)原创 2013-08-11 15:10:29 · 849 阅读 · 0 评论 -
电梯的调度算法
对于O(n)的算法,假设电梯停在第i层楼,显然可以计算出所有乘客总共要爬楼梯的层数Y,如果有N1个乘客目的在第i层楼一下,有N2个乘客在第i层楼,还有N3个乘客在第i层楼以上。此时,如果电梯停在i - 1层(从第一层开始考察),所有目的地在第i层及以上的乘客都要多爬一层,总共需要多爬N2 + N3层,而所有目的地在第i - 1层及一下的乘客可以少爬一层总共可以少爬N1层。因此总共需要爬的层数为Y-原创 2013-08-10 18:31:26 · 1733 阅读 · 0 评论 -
深度优先搜索之部分和问题
//给定整数a1,a2,a3...an判断是否可以从中选出若干数,使他们的和恰为k//从a1开始按顺序决定每个数加或者不加,在全部n个数都决定后再判断它们的和是不是k即可,复杂度O(2的n次方)#include #include using namespace std;vector sta;//深度优先搜索从最开始的状态出发,遍历所有可以到达的状态,由此可以对所有状态进行操原创 2013-08-07 20:23:05 · 1015 阅读 · 0 评论 -
Lake Counting
/*有一个大小为M*N的园子,雨后积起了水。八连通的积水认为是连接在一起的。请求出园子里总共有多少水洼*///八连通指的是下图中相对W的*的部分// * * *// * W *// * * *#include using namespace std;void dfs(char field[10][13], int M, int N, int x,原创 2013-08-07 22:52:24 · 614 阅读 · 0 评论 -
Hanoi塔问题
分治算法与软件设计的模块化方法类似。为了解决一个大的问题,将一个规模为n的问题分解为规模较小的子问题,这些子问题相互独立并且和原问题相同。分解这些子问题,最后将各个子问题的解合并到原问题的解。子问题与原问题类似,可以递归的使用分治策略解决。Hanio(n, x, y, z)问题分成三个子问题:问题1:Hanio(n - 1, x, z, y)将x柱上的n - 1个圆盘借助Z柱移到Y柱上原创 2013-08-09 10:42:35 · 597 阅读 · 0 评论 -
宽度优先搜索——迷宫的最短路径
#include #include #include using namespace std;const int INF = 10000000;typedef pair Point;int sx;//起点坐标int sy;int gx;//终点坐标int gy;//到各个位置的最短距离的数组int d[100][100];//4个方向移动的向量,对应原创 2013-08-09 16:59:45 · 1210 阅读 · 0 评论 -
对一个结构体或类的数组进行排序
根据人的属性对人进行排序,之后输出结果。将每个人看成一个对象,这个对象有ACM、金钱、人品三个属性,排序优先顺序是ACM、金钱、人品。因此ACM成绩相同时比较金钱,如果金钱再相同时比较人品值。首先我们先定义一个men对象:struct men{ int ACM; int Money; int RP;}men对象一共有三个成员。比原创 2013-08-09 22:13:25 · 1448 阅读 · 0 评论 -
区间调度问题
有n项工作,每项工作分别在start[i]时间开始,在End(i)时间结束。对于每项工作,你都可以选择参与与否,如果选择参与,那么自始至终必须全程参与。此外参与时间段不能重叠(即使是开始的瞬间与结束的瞬间重叠也是不允许的),那么最多能参与多少项工作?//算法思想:在可选的工作中,每次都选取结束时间最早的工作#include #include #include using nam原创 2013-08-10 11:06:44 · 1208 阅读 · 0 评论 -
sort的使用经验
1.list 里有个方法sort方法。注意Vector很多方法和list一样,但是,这个方法Vector是没有的。 (1).整型数据排序 void ListSortTest(){ list num; num.push_back( 1 ); num.push_back( 3 ); num.push_back( 2 );转载 2013-08-09 21:22:38 · 783 阅读 · 0 评论 -
贪心算法——硬币问题
有1元,5元,10元,50元,100元,500元的硬币各C1,C5,C10,C50,C100,C500枚。现在要用这些硬币来支付A元,最少需要多少枚硬币?#include using namespace std;int V[6] = {1, 5, 10, 50, 100, 500};//硬币面值int C[6] = {3, 2, 1, 3, 0, 2};//硬币对应的个数int原创 2013-08-10 10:24:30 · 2540 阅读 · 0 评论 -
STL的排列算法next_permutation
#include #include #include using namespace std;//定义一个测试数组void TestArray(){ cout << "TestArray is :" << endl; int b[] = {3, 2, 1}; int count = sizeof(b) / sizeof(int); //因为n原创 2013-08-09 21:01:44 · 494 阅读 · 0 评论 -
sort算法
1 所有sort算法介绍 所有的sort算法的参数都需要输入一个范围,[begin, end)。这里使用的迭代器(iterator)都需是随机迭代器(RadomAccessIterator), 也就是说可以随机访问的迭代器,如:it+n什么的。(partition 和stable_partition 除外) 如果你需要自己定义比较函数,你可以把你定义好的仿函数(functor)作为转载 2013-08-09 21:06:53 · 1047 阅读 · 0 评论 -
STL中泛型算法find_if()与sort()的应用举例及详解
STL中泛型算法find_if()与sort()的应用举例及详解 请认真看下原型://find_if()的原型: template InputIterator find_if ( InputIterator first, InputIterator last, Predicate pred ); //sort()的原型: template转载 2013-08-09 21:20:29 · 683 阅读 · 0 评论 -
阿布学排序之直接选择排序
package select;/** * 需求:直接选择排序 * 方法:将数据分为有序区和无序区,然后从无序区选一个最小元素,放在有序区的最后 * 步骤:设数组为a[0...n-1] * 1、初始时,数组全为无序区a[0...n-1],令i=0; * 2、在无序区a[i...n-1]中选择一个最小元素,并将其与a[i],交换之后a[0...i]就形成了一个有序区 * 3、i++重复2原创 2014-05-30 11:49:20 · 582 阅读 · 0 评论