基本算法 (C++)
Deutschester
初入职场的互联网新人,正在快速成长中……
展开
-
有序全排列生成算法集锦
/* Name: 有序全排列生成算法集锦 Copyright: 始发于goal00001111的专栏; Description: 实现了五种有序全排列生成算法。有关算法的分析讨论详见拙作《有序全排列生成算法》:http://blog.csdn.net/goal00001111/archive/2008/11/18/3326619.aspx*/#inclu转载 2009-06-24 20:13:00 · 1506 阅读 · 0 评论 -
输出一个集合所有的子集合
<br />#include <iostream><br />using namespace std;<br />const int N = 1000;<br />void SelSubstr(int flag[],int count)<br />{<br /> for(int i = 0;i < count;i++)<br /> {<br /> flag[i] = flag[i]^1;<br /> //当前元素取反后为0则停止。这样取反正好有2^n-1种情况,而且不重复。<br /> if(!fla原创 2010-08-14 22:09:00 · 929 阅读 · 0 评论 -
高效率的全排列算法——N进制方法实现
算法描述:全排列N进制算法—— 从1到N,输出全排列,共N!条。 分析:用N进制的方法。设一个N个单元的数组a用来存放待全排列的数组的下标,对第一个单元做加一操作,满N进一。每加一次一就判断一下各位数组单元有无重复,有则再转回去做加一操作,没有(且数组a中没有值为N的元素)则说明得到了一个排列方案。例如:求1-3的全排列,共3!条设数组初始状态为0 0 0,以下为计算全排列的步骤:0 0 0 +11 0 0 +12 0 0 +13 0 0 满3进1 ->0 1 0 +11 1 0 +12 1 0 +13 1原创 2010-06-22 21:15:00 · 4972 阅读 · 2 评论 -
快速排序——非稳定排序nlog(n)
#include #include using namespace std;//以最高位的数字作为划分元素int partition(int *a,int low,int high){ int i = low-1; int j = high; int parti = a[high]; //以最高位的数字作为划分元素 while(1) { while(a[++i] while(a[--j] > parti) //从右到左找到第一个比parti小的数a[j] if(i >= j)原创 2010-08-15 09:54:00 · 1170 阅读 · 0 评论 -
词频统计的C++实现(使用stl--map)
<br />#include <map> #include <fstream> #include <iostream> #include <string> using namespace std; void display_map(map<string, int> &wmap); int main() { const char *szInputFileName="Text.txt"; ifstream ifs(szInp转载 2010-09-15 01:24:00 · 6699 阅读 · 1 评论 -
求两个字符串最长公共子串(LCS问题)
<br /><br />自:http://blog.chinaunix.net/u2/61062/showart_477508.html<br /><br /><br />算法的基本思想:<br />当字符匹配的时候,不是简单的给相应元素赋上1,而是赋上其左上角元素的值加一。我们用两个标记变量来标记矩阵中值最大的元素的位置,在矩阵生成的过程中来判断当前生成的元素的值是不是最大的,据此来改变标记变量的值,那么到矩阵完成的时候,最长匹配子串的位置和长度就已经出来了。<br /> <br />代码:<br />#转载 2010-09-15 22:05:00 · 1393 阅读 · 0 评论 -
各种排序源程序(附带驱动程序,直接可以测试)
<br />#include <iostream>#include <ctime>using namespace std;void ArrayCopy(int a[],int b[],int n){ for(int i=0;i<n;i++) b[i] = a[i];}void InsertSort(int a[],int b[],int n){ ArrayCopy(a,b,n); //还原原始的数据 int temp; for(int i=1;原创 2010-12-01 21:47:00 · 1077 阅读 · 0 评论 -
将两个有序数组归并为一个有序数组
<br /> <br />以下给出了两种风格的代码,但算法实质是一样的:<br /> <br />#include <iostream>using namespace std;//合并两个有序数组void mergeYouxu1(int a[],int m,int b[],int n,int c[]){ int aL = 0; int bL = 0; for(int i = 0;i<m+n;i++) { if(aL == m) //防止a越界 { c[原创 2010-10-12 10:23:00 · 7436 阅读 · 0 评论 -
第(前)k大数问题
所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题。===解法1: 我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*logn + k)。《编程之美》2.5节课后习题:1. 如果需要找出N个数中最大的K个不同的浮点数呢?比如,含有10个浮点数的数组(1.5,1.5,2.5,3.5,3.5,5,0,-1.5,3.5)中最大的3个不同的浮点数是(5,3.5,2.5)。解答:上面的解法均适用,需要注意的是浮点数比较时和整数不转载 2010-10-12 13:39:00 · 1219 阅读 · 0 评论 -
排序算法性能及选择总结(待完善)
<br /> <br />各种排序方法的性能比较:<br /><br /><br />排序法<br /> 平均时间<br />最坏情况<br />最好情况<br />稳定度<br />额外空间<br />备注<br />1.直接插入<br /> O(n2)<br />O(n2)<br /> O(n)<br /> 稳定<br />O(1)<br />大部分已排序时较好(简单)<br />1.希尔<br />O(nlogn)<br />O(nlogn)<br />与步长相关<br />不稳定<br />O(1原创 2010-10-17 01:28:00 · 3351 阅读 · 1 评论 -
排序算法性能及选择总结(待完善)
<br /> <br />各种排序方法的性能比较:<br /><br /><br />排序法<br /> 平均时间<br />最坏情况<br />最好情况<br />稳定度<br />额外空间<br />备注<br />1.直接插入<br /> O(n2)<br />O(n2)<br /> O(n)<br /> 稳定<br />O(1)<br />大部分已排序时较好(简单)<br />1.希尔<br />O(nlogn)<br />O(nlogn)<br />与步长相关<br />不稳定<br />O(1原创 2010-10-17 01:29:00 · 931 阅读 · 0 评论 -
不含有重复数字的组合的求法——递归法和二进制法
//组合#include #include int n,r;int count = 0;void printR(int a[]){ count++; for(int j = r-1;j>=0;j--) printf(" %d",a[j]); printf("/n");}void comb(int a[],int m,int k){ for(int i=m;i>=k;i--) { a[k-1] = i; if(k>1) comb(a,i-1,k-1); else printR(a); }}in原创 2010-06-05 14:00:00 · 3178 阅读 · 0 评论 -
一个简单的大数乘法算法
#include using namespace std;const int N = 1000; //自定义大数的长度,可以根据需要调整void LongMulti(char* str1,char* str2){ int result[N] = {0}; int i,j; int str1_lenght = strlen(str1); int str2_lenght = strlen(str2); //计算 for(i=str1_lenght-1;i>=0;i--) { for(j=str2_lenght原创 2010-06-03 11:19:00 · 1405 阅读 · 0 评论 -
按单词反转字符串
6,按单词反转字符串 并不是简单的字符串反转,而是按给定字符串里的单词将字符串倒转过来,就是说字符串里面的单词还是保持原来的顺序,这里的每个单词用空格分开。例如:Here is www.fishksy.com.cn经过反转后变为:www.fishksy.com.cn is Here如果只是简单的将所有字符串翻转的话,可以遍历字符串,将第一个字符和最后一个交换,第二个和倒数第二个交换,依次循环。其实按照单词反转的话可以在第一遍遍历的基础上,再遍历一遍字符串,对每一个单词再反转一次。这样每个单词又恢复了原来的原创 2010-06-01 12:15:00 · 1534 阅读 · 0 评论 -
删除特定字符
思 路 : 使用字符作为数组的下标(C语言允许把字符映射为整数去充当数组的下标)或者作为hash表的关键字。viod removechars (char str[], char remove[])注意,remove中的所有字符都必须从str中删除干净。例如,如果str: "Battle of the Vowels: Hawaii vs. Grozny", rem转载 2010-01-15 15:35:00 · 1027 阅读 · 1 评论 -
常用排列与组合的相关算法
一、排列(permutation)(1)递归方法 (非有序)设R={r1,r2,...,rn}是要进行排列的n个元素,Ri = R-{ri}. 集合 X 中元素的全排列记为Perm(X)。(ri)Perm(X)表示在全排列Perm(X)的每一个排列上加前缀ri得到的排列。R的全排列可归纳定义如下:当 n = 1 时, Perm(R) = (r),其中r 是集合R中唯一的元素;当 n原创 2010-01-13 00:20:00 · 994 阅读 · 0 评论 -
N皇后——递归和非递归
总结: 8皇后的解有92种,但由于对称性,真正独立的解是12种 其中一种方案只能衍生出4个答案的情况, 所以不重复的方案是12个,其中一个是对称图形,最终结果是11*8+1*4=92。 那个特殊方案就是: . . X . . . . . . . . . X . . . .转载 2010-01-23 20:17:00 · 1196 阅读 · 0 评论 -
约瑟夫问题(Josephus问题)的递推O(n)解法、循环解法、单循环链表解法
(一) O(n)时间的解法 只能解出最后一个出局的人,也就是最后留下的人——默认是从编号为1的人开始数起 n个人在一个圆桌上吃饭,每m个人杀掉一个,直到最后剩下一个人。问最后剩下哪个人?将人分别标记为0,1,2,...,n-1,得到n的一个完全剩余系。可得如下递推公式: /- (J(n-1,m)+m+1) mod n, 当n>1J(n,m)=|原创 2010-01-12 16:38:00 · 3092 阅读 · 0 评论 -
各种排序算法总结(待完成)
参考:http://blog.csdn.net/lambp314/archive/2009/02/25/3932270.aspx http://blog.csdn.net/StuRun/archive/2008/12/11/3491225.aspx(简洁,好) http://blog.csdn.net/yuguanglou/archive/2004/11/24/193133.a原创 2010-01-15 14:58:00 · 641 阅读 · 0 评论 -
字符串反序函数的递归与非递归解法
(一)递归解/*这个函数的功能是,对字符串进行判断,从第一个字符开始,判断其是否为空,不为空,则递归调用,对下一个判断,直到为空,则返回,从最里层打印输出,即最后一个字符打印输出*/ void inverse(char *p) { if( *p == /0 ) return; inverse( p+1 ); printf( "%c", *p ); } int mai转载 2010-01-13 00:13:00 · 1539 阅读 · 0 评论 -
C++篮球错排问题 ——实质是求满足错排条件下的全排列
<br />问题描述:<br /> <br />请编写程序求解篮球错排问题。已知n个篮子一字排开(n为用户输入的任意正整数),从左到右分别标着号:1,2,... ...,n;每个球也有编号,分别也是1,2,... ...,n。现要将这n个球全部放入这n个篮子中,满足:每个篮子放置1个球,球的号不能与其所在的篮子的号相同,且在相邻篮子内的球的球号不能相邻。例如,如果在相邻两个篮子内的球的球号分别为9和10,则是不允许的。请输出所有符合要求的放球方式(对于每种符合要求的放球方式,都应输出在每个篮子中的球号)。<原创 2010-07-03 21:04:00 · 2315 阅读 · 0 评论 -
字符串反转(除了某个子字符串)
输入:第一个字符串: "This is fishsky 's Chinese site: http://www.fishsky.com.cn/cn"子串: "fishsky"输出: "nc/nc.moc.fishsky.www//:ptth :etis esenihC s'fishsky si sihT"一般的方法是先扫描一边第一个字符串,然后用stack把它反转,同时记录下子串出现的位置。然后再扫描一遍把记录下来的子串再用stack反转。我用的方法是用一遍扫描数组的方法。扫描中如果发现子串,就将子串倒过来原创 2010-06-01 14:13:00 · 705 阅读 · 0 评论 -
删除数组中重复的数字
<br />问题:一个动态长度可变的数字序列,以数字0为结束标志,要求将重复的数字用一个数字代替,例如:<br /><br />将数组 1,1,1,2,2,2,2,2,7,7,1,5,5,5,0 转变成1,2,7,1,5,0 问题比较简单,要注意的是这个数组是动态的。<br /> <br /> <br />======================<br /> <br />#include <iostream><br />#include <vector><br />using namespace std原创 2010-06-01 20:45:00 · 1303 阅读 · 0 评论 -
计算阶乘
#include using namespace std;const int N = 40000;void JieCheng(int n){ int result[N]; //保存结算结果的数组 int height; //结果的最高位长度 result[0] = 1; height = 1; //计算 for(int i=1;i { int res = 0; //进位 for(int j=0;j { int buf = result[j]*i + res; //计算原创 2010-06-01 21:37:00 · 687 阅读 · 0 评论 -
求n的n次幂和: 1^1+2^2+3^3+……+n^n
<br />编程实现计算 1^1+2^2+3^3+……+n^n,其中n为用户输入的任意整数。(提示:要考虑结果可能超出长整数long的表示范围的情况) <br /> <br />注意:本方法中采用整形数组元素存放大数的每一位<br /> <br /> <br />=================================<br /> <br />#include <iostream><br />using namespace std;<br />const int N = 10000; //定义能原创 2010-06-03 01:11:00 · 5580 阅读 · 0 评论 -
排序算法性能及选择总结
各种排序方法的性能比较:排序法 平均时间最坏情况最好情况稳定度额外空间备注1.直接插入 O(n2)O(n2) O(n) 稳定O(1)大部分已排序时较好原创 2010-10-15 00:45:00 · 2910 阅读 · 0 评论