算法
文章平均质量分 69
Ainiybs
这个作者很懒,什么都没留下…
展开
-
排序算法之冒泡排序
冒泡算法的实现思想比较简单,从待排序数组的首个元素开始扫描数组,若遇到当前元素大于他的后继元素,则交换两者顺序(降序的话判断条件相反),每一遍遍历均有一个最小的元素排至前端,就想冒泡一样,较轻的元素慢慢升上来。时间复杂度为O(n^2),空间复杂度为O(1)版本一:基础的冒泡排序void EX_SortBubble(int a[], int n){ for (int i =原创 2013-11-08 11:12:21 · 523 阅读 · 0 评论 -
Partion方法的应用
快速排序算法是常见的排序算法的一种,其实现思想是一个给代原创 2014-06-25 23:57:33 · 2256 阅读 · 0 评论 -
字符串----找出字符串中第一个只出现一次字符
题目:找出字符串中第一个只出现一次的原创 2014-06-26 23:45:58 · 542 阅读 · 0 评论 -
查找绝对值等差数列
不晓得题目是否合适,百度的笔试中有这样一道题目:一个数列,相邻元素差值的绝对值为1,比如4323456543,现在在这个数列中查找一个数字,如果找到,打印该数字位置,没有找到,则打印not found。在序列中查找元素,如果序列有序,可以采用折半查找等方法,只与数列的规模N有关系,但因为数列摆动,比如3,出现在3个位置,所以不能缩小查找的规模,只能遍历完整个数组。所以最基本的想法是从头至尾便利原创 2013-11-09 15:45:54 · 752 阅读 · 0 评论 -
两个数的最大公约数
笔试面试题目中经常会遇到两个数最大公约数的问题,一种比较流行的方法是,用较大者除以较小者,若整除,较小者为最大公约数,若有余数,则求余数与较小者的最大公约数,递归实现。它是基于这样一个事实,即若x = k*m;y=k*n;那么y/x = n/m; y%x = k*(m%n);即x和y%x也有最大公约数k.这种方法很容易编程实现,但是一个不足时计算机计算取模运算相当于除法,很耗时间,于是有了进一步改原创 2013-11-08 22:47:29 · 449 阅读 · 0 评论 -
排序算法之堆排序
由于前面的排序算法均存在多余比较的行为,那么如果可以记住比较的结果,效率可以进一步提高,所以就出现了堆排序。堆排序的一般步骤是,将数组构造成一个最大堆,然后交换对顶元素和数组最末端的元素,这样就破坏了最大堆的性质(每一个节点的值均大于左右子节点的值),于是需要重新调整,使得堆成为最大堆,堆排序可以在O(1)时间内获取元素的最大值。核心算法在于维护堆的性质。void AdjustHeap(i原创 2013-11-08 20:55:14 · 400 阅读 · 0 评论 -
大数加法和大数乘法
面试或者笔试的时候经常会遇到这样的题目,比如写一个计算两数之和的程序。如果对于加数与和有限制,比如说,保证不会溢出,那么还好,如果没有限制,很可能就会调入陷阱,因此靠考虑溢出的情况,这个时候就需要考虑用字符串模拟加法运算了,乘法也是一样。用字符串模拟加法运算其实很简单,两个数相加,和的长度最长为较长字符串+1,然后对应位分别相加,注意加上进位,后期可以补上代码。这里主要说下大数乘法。大数乘原创 2013-11-08 21:41:32 · 724 阅读 · 0 评论 -
排序算法之归并排序
归并思想是将问题分解为更小的、同性质的子问题,求解子问题,然后合并子问题的解得到原问题的解。经历一个分界、求解、合并的过程。因此上归并排序为将数组分为若干个子数组,分别排序,然后合并子数组的排序结果,即合并两个排序的数组,相关代码如下:void MergeAubArray(int res[], int a[], int left, int mid, int right) //子数组以mid原创 2013-11-08 21:09:31 · 376 阅读 · 0 评论 -
排序算法之shell排序
希尔排序和快速排序有些类似,也是基于分组的意识,不同的是,希尔排序分组的基准是步长,步长相等的元素参与排序,再缩小步长,由于此时数组已经基本有序,所以有了较为快的执行速度,当步长为1时,对整个数列排序。算法要求最后一步步长必须为1,此时shell排序退化为冒泡排序。关于如何选择步长,可以参考其他的资料,后续补充。void EX_SortShell(int a[], int n){原创 2013-11-08 20:44:35 · 447 阅读 · 0 评论 -
排序算法之快速排序
快速排序是一种不稳定的排序算法,它的基本思想是,以某个元素为基准,将所有大于等于它的值放在右边,小于它的值放在左边,这样数组就被分为两部分,递归对这两部分进行快速排序,而单个元素我们认为是已经排好序的。这是一种归并思想,当然在最后一步,合并,我们什么也没有做也不用做。每一次排序都有一个元素被放在正确的位置,所以该算法总是会结束。因此,算法的精髓在于如何选择基准并分为两个子数组。选择基准有很多种方式原创 2013-11-08 20:15:57 · 455 阅读 · 0 评论 -
排序算法之插入排序
插入排序思想和选择排序一样单纯,一个有序区和一个无序区,初始状态都是无序的,然后每次从无序区取出一个元素,插入有序区他应该在的位置原创 2013-11-08 14:24:22 · 356 阅读 · 0 评论 -
动态规划:从新手到专家
http://hawstein.com/posts/dp-novice-to-advanced.html点击打开链接动态规划:从新手到专家March 26, 2013作者:Hawstein出处:http://hawstein.com/posts/dp-novice-to-advanced.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署转载 2013-11-21 16:36:39 · 464 阅读 · 0 评论 -
排序算法之选择排序
选择排序的思想很单纯,将数组分为有序区和无序区,每次从无序区中选择一个最大或者最小的元素,放在有序区,直至无序区元素个数为0,此时,数组排序完成。版本一:void EX_SortSelect(int a[], int n){ for (int j = 0; j < n; ++j) { int minDir = j; for (int i = j原创 2013-11-08 11:33:00 · 366 阅读 · 0 评论 -
算法----约瑟夫环的简易实现
题目:用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。原创 2014-07-10 12:20:09 · 572 阅读 · 0 评论