1、当一个函数用它自己来定义时就称为递归的。C允许函数是递归的。但重要的是:C提供的仅仅是遵循递归思想的一种企图。不是所有的数学递归函数都能有效地(或正确地)由C的递归模拟来实现。int Bad(unsigned int N){ if (N == 0) { return 0...
分类:
编程语言 时间:
2015-01-11 22:54:12
阅读次数:
212
题目一: 不含头结点的单链表转置,算法时间复杂度O(N)代码如下:struct LNode;typedef struct LNode *List;typedef struct LNode *Position;struct LNode{ ElementType elem; Position...
分类:
编程语言 时间:
2015-01-09 22:08:37
阅读次数:
234
代码:#include templatelist Intersect(const list &list_1, const list &list_2){ list result; auto leftPos = list_1.begin( ); auto rightPos = list...
分类:
编程语言 时间:
2015-01-09 20:57:26
阅读次数:
147
思路: 对于p(x)中的每一个因式,与q(x)中每一个因式相乘的结果,保存于另外的链表中; 对于保存结果的链表排序,并去重,即去除系数相同的因式结点,但系数相加代码:#include using namespace std;struct Node{ int coefficient ...
分类:
编程语言 时间:
2015-01-09 19:01:42
阅读次数:
208
和分治思想的第一次相遇
当问题的规模是可以划分的时候,分治的算法往往是很有效的:
不断分割问题的规模,直到子问题的规模足够小便直接求解,之后不断整合子问题的解得到更大规模的解,最后得到完全解。
归并排序就是分治算法的一个简单的例子。
可能有人觉得快速排序也是属于分治算法,但我不这么觉得,因为快速排序是先得到大问题的解的一部分,再靠子问题来完成解,
并没有整合子问题这一步,所以硬要说的...
分类:
编程语言 时间:
2015-01-08 02:09:41
阅读次数:
290
这题目是经典的DP题目,也可叫作LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长不下降子序列。很基础的题目,有两种算法,复杂度分别为O(n*logn)和O(n^2) 。A.O(n^2)算法分析如下:(a[1]...a[n] 存的都是输入的数)1、对于a...
分类:
编程语言 时间:
2015-01-07 18:26:49
阅读次数:
280
生活中的“插入排序”
扑克牌我们大部分人都玩过,当然也都知道该怎么把刚抓上来的牌放哪里,最后得到一手排好的牌。但其中所蕴含的算法原理
不知道你有没有想过。计算机科学家把人的这一直观想法翻译为计算机程序于是便有了我们所说的插入排序:
图示
代码(C++)
/*************************************
函数:插入排序
说...
分类:
编程语言 时间:
2015-01-06 18:06:14
阅读次数:
208
要理论的话,请自行翻阅《数据结构与算法分析 c语言描述》和《算法导论》,我就贴个代码,请勿吐槽。
分类:
编程语言 时间:
2015-01-06 11:21:50
阅读次数:
170
为什么叫快速排序
这个标题是带有歧义的,每一种排序都有自己的名字,有的是发明者+排序(Shell排序),有的是用的步骤名称+排序(插入排序)...
而快速排序是以它的属性+排序为名(这不是废话吗)。那么我再换个意义明确的标题:
快速排序为什么那么快
要弄明白这一点首先需要了解基于比较的排序模型:决策树
对大小为n的输入,其位置关系有n!种可能。排序算法的工作就是在所有...
分类:
编程语言 时间:
2015-01-06 10:14:03
阅读次数:
249
(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树。二叉堆可以分为两种形式:最大堆和最小堆。若将记录按从大到小排列,建“小”顶堆。若将记录按从小到大排,建“大”顶堆。说明:在堆排序算法中,我们使用的是最大堆,最小堆通常用于构造优先队列。算法分析:时间复杂度是O(nlogn)。堆排序属于原址排序:...
分类:
编程语言 时间:
2015-01-05 23:09:50
阅读次数:
390