
algorithm
chen802311
qq: 727690080
展开
-
全排列之字典序法
(1) 对于输入的字典序排列,反向查找第一对满足a[j](2) 仍旧反向查找第一个下标k,使得 a[j](3) 交换a[j]和a[k](4) 翻转a[j+1]~a[end]此法能适应有重复元素的系列代码如下:#include #include using namespace std;int cmp(const void* a, const void* b原创 2014-01-05 20:15:58 · 761 阅读 · 0 评论 -
寻找满足条件的两个数
一: 输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字 代码如下:#include #include using namespace std;struct m_elem{ int unm; int data;};struct m_pair{ int f, s; m_pair* next; m_pair(int ff, int ss) :原创 2013-12-24 20:38:52 · 482 阅读 · 0 评论 -
两个字符串是否包含
以下是三个小程序,我需要多多动手,所以也顺便记下以后方便(1):两个字符串是否包含,程序如下:/* 这里没有考虑大写、重复的情况,不过稍加修改就能 适应,用了hashtable的方法 */#include using namespace std;bool m_iscontain(char* f_str, char* s_str){ char fl原创 2013-12-17 09:30:36 · 494 阅读 · 0 评论 -
生成最短摘要
给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法代码如下:/* 算法思想:从头扫描输入字符串,找到第一个在关键字中出现的单词 记录其偏移量,继续往后扫描得到出现在关键字中的第二个单词(可以 和第一个相同),一直到此子串包含所有的关键字,此时也需要记录 其偏移量,计算其大小;接下来继续从以上子串中的第原创 2014-01-08 21:20:55 · 810 阅读 · 0 评论 -
四个常用且重要的数据结构
重要数据结构 二叉堆 查并集原创 2014-01-14 18:41:35 · 914 阅读 · 0 评论 -
二分查找
无意中看到二分查找几个字眼,就情不自禁的构思它的实现代码,特此写下来当是练手一:在此有两种方法的实现,一种是递归的另一种是非递归的,代码如下:#include using namespace std;// recursionint m_binarySearch(int arr[], int left, int right, int num){ if(right >= left原创 2013-12-23 20:19:14 · 416 阅读 · 0 评论 -
组合之01转换法
m个数中取n个数的所有组合问题从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,同时将其左边的所有“1”全部移动到数组的最左端代码如下:#include using namespace std;#define SIZE 100struct data{ int elem; int b;};inline void原创 2014-01-06 11:01:36 · 1392 阅读 · 0 评论 -
寻找满足条件的多个数
输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来 代码来自编程艺术,如下:#include #include using namespace std;list lst;void m_findSum(int sum, int n){ if(sum < 1 || n < 1) re原创 2013-12-30 22:01:03 · 498 阅读 · 0 评论 -
求解500万以内的亲和数
代码来自《编程艺术系列》这段代码很优雅、很有内涵,如下:#include using namespace std;#define MAXVAl 5000000int sum[MAXVAl+1];int main(int argc, char* argv[]){ int i, j; for(i = 0; i <= MAXVAl; i++){原创 2014-01-01 22:34:53 · 749 阅读 · 0 评论 -
败者树
一:胜者树和败者树都是完全二叉树,是树形选择排序的一种变型。每个叶子结点相当于一个选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛。二:不同的是,胜者树的中间结点记录的是胜者的标号;而败者树的中间结点记录的败者的标号。三:胜者树与败者树可以在log(n)的时间内找到最值。任何一个叶子结点的值改变后,利用中间结点的信息,还是能够快速地找到最值。在k路归并排序中经常用到#includ原创 2014-01-03 22:09:00 · 929 阅读 · 0 评论 -
双端LIS问题
从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的(网易)代码如下:#include #include using namespace std;int find(int* arr, int len, int n){ int left = 0, right = len, mid = (left+right)/2; while (left <= right){原创 2013-12-31 17:03:51 · 1195 阅读 · 0 评论 -
堆排序
一:优先队列是一种思想是一种需求,实现它的方法有多种(可以用单链表、二叉查找树等数据结构),但是最常用的实现是使用二叉堆二:与二叉查找树一样其也有两个性质,结构性质和堆序性质;支持两种基本操作deleteMin、insert(此处用最小堆)三:实现二叉堆数据结构及两种基本操作的代码如下:原创 2013-12-22 08:13:41 · 460 阅读 · 0 评论 -
shell排序
虽然代码不多,但是逻辑性很强一:shell排序,代码如下:/* 用到的增量系列 h = h*3 + 1, 所以逆系列为 h = (h-1)/3; */#include using namespace std;void m_shellSort(int* arr, int nLen){ int h = 1; // 得到系列最大值 while(h原创 2013-12-19 12:25:51 · 445 阅读 · 0 评论 -
归并排序
不动手敲一敲不知道会不会,把基础搞踏实了一:归并排序,代码如下:#include using namespace std;#define ARR_SIZE 200void m_merge(int* arr, int left, int middle, int right){ int tmp[ARR_SIZE]; int pos = left, p_be原创 2013-12-18 15:40:04 · 426 阅读 · 0 评论 -
快速排序
把握宏观思想,温故而知新一:回过头来看学过的东西,抛开资料自己动手敲一遍,如下是快速排序:#include using namespace std;inline void m_swap(int* a, int* b){ int tmp; tmp = *a; *a = *b; *b = tmp;}void m_qsort(int* arr, int left, int原创 2013-12-17 20:28:17 · 474 阅读 · 0 评论 -
左旋转字符串
把学过的东西记下来,因为我记性不好!一:对左旋转字符串的两种我比较中意的解法:(1):三次翻转法,代码如下:#include using namespace std;void m_reverse(char* start, char* end){ char tmp; while(start < end){ tmp = *start; *start = *end;原创 2013-12-16 21:00:13 · 466 阅读 · 0 评论 -
最长递增子系列(LIS)
最近遇到的,此代码来自《算法导论》 具体代码如下:#include #include using namespace std;#define INF -99999int find(int* arr, int len, int n){ int left = 0, right = len, mid = (left+right)/2; while (lef原创 2013-12-30 21:54:49 · 467 阅读 · 0 评论