
算法
文章平均质量分 61
shanshanhi
这个作者很懒,什么都没留下…
展开
-
快速排序算法及其优化方法
1、基本快速排序class QuickSort {public: void swap(int a[],int i,int j){ int temp=a[i]; a[i]=a[j]; a[j]=temp; } int partition(int a[],int low,int high){ int key=a[lo原创 2016-06-07 16:32:45 · 915 阅读 · 0 评论 -
各种排序算法的总结和比较
1 快速排序(QuickSort)快速排序是一个就地排序,分而治之,大规模递归的算法。从本质上来说,它是归并排序的就地版本。快速排序可以由下面四步组成。(1) 如果不多于1个数据,直接返回。(2) 一般选择序列最左边的值作为支点数据。(3) 将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据。(4) 对两边利用递归排序数列。快速排序比大部分排序算法转载 2017-03-13 13:14:34 · 1023 阅读 · 0 评论 -
归并排序的实现
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。[cpp] view plain copy转载 2017-03-13 13:02:12 · 298 阅读 · 0 评论 -
排序算法——桶排序
桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的阵列内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。 例如要对大小为转载 2017-03-08 13:03:37 · 249 阅读 · 0 评论 -
汉诺塔问题
在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘,求把圆盘从下面开始按大小顺序重新摆放在另一根柱子上需要移动多少次。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。解答:我们可以拿n=3的时候举例子:易知f(1)=1,f(2)=3,f(3)=7……;当n=2时候(1,2,3分别表示小中大三块盘子):当n=3时候:转载 2017-01-11 16:53:48 · 1913 阅读 · 0 评论 -
递归函数时间复杂度分析二
在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解。实际上,这个问题是数学上求解渐近阶的问题,而递归方程的形式多种多样,其求解方法也是不一而足,比较常用的有以下四种方法: (1)代入法(Substitution Method) 代入法的基本步骤是先推测递归方程的显式解,然后用数学归纳法来验证该解是否合理。 (2转载 2017-02-16 18:27:05 · 1071 阅读 · 0 评论 -
递归函数时间复杂度分析一
递归算法的时间复杂度分析(1) 递归执行过程 例子:求N!。 这是一个简单的"累乘"问题,用递归算法也能解决。 n! = n * (n - 1)! n > 1 0! = 1, 1! = 1 n = 0,1 因此,递归算法如下: Java代码 fact(int n) { if(n == 0转载 2017-02-16 18:26:13 · 1006 阅读 · 0 评论 -
算法的时间复杂度和空间复杂度-总结
通常,对于一个给定的算法,我们要做 两项分析。第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式、数学归纳法等。而在证明算法是正确的基础上,第二部就是分析算法的时间复杂度。算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的优劣与否。因此,作为程序员,掌握基本的算法时间复杂度分析方法是很有必要的。 算法转载 2017-02-16 18:20:01 · 1938 阅读 · 0 评论 -
二分查找算法
#include using namespace std;//二分查找,在长度为len的数组array中查找key元素,找到则返回key元素在数组中的下标,找不到返回-1 int binary_search(int array[], int len, int key){ int start = 0; int end = len - 1; while(start <= end)原创 2017-01-03 10:22:29 · 401 阅读 · 0 评论 -
排序算法总结--归并排序算法
归并排序算法在排序算法中快速排序的效率是非常高的,但是还有种排序算法的效率可以与之媲美,那就是归并排序;归并排序和快速排序有那么点异曲同工之妙,快速排序:是先把数组粗略的排序成两个子数组,然后递归再粗略分两个子数组,直到子数组里面只有一个元素,那么就自然排好序了,可以总结为先排序再递归;归并排序:先什么都不管,把数组分为两个子数组,一直递归把数组划分为两个子数组,直到数组里只有一个元素原创 2017-01-03 09:54:34 · 450 阅读 · 0 评论 -
2017百度实习生招聘算法题
题目一:[编程题] 单词接龙 拉姆刚开始学习英文单词,对单词排序很感兴趣。 如果给拉姆一组单词,他能够迅速确定是否可以将这些单词排列在一个列表中,使得该列表中任何单词的首字母与前一单词的为字母相同。 你能编写一个程序来帮助拉姆进行判断吗? 输入描述: 输入包含多组测试数据。 对于每组测试数据,第一行为一个正整数n,代表有n个单词。 然后有n个字符串,代表n个单词。原创 2016-07-27 21:43:09 · 1441 阅读 · 1 评论 -
编程之美2.21 只考加法的面试题
题目:.我们知道:1+2=3; 4+5=9; 2+3+4=9; 等式左边都是两个以上连续的自然数相加,那么是不是所有的整数都可以写成这种形式呢? .问题1. 写一个程序,对于一个64位正整数,输出它所有可能的连续自然数(两个以上)之和的算式; .问题2. 有的数例如32就找不到这样的表达,这样的数字有什么规律? .问题3. 在64位正转载 2016-07-27 16:07:47 · 416 阅读 · 0 评论 -
如何判断链表中是否有环
1.如何判断是否有环?如果有两个头结点指针,一个走的快,一个走的慢,那么若干步以后,快的指针总会超过慢的指针一圈。2.如何计算环的长度?第一次相遇(超一圈)时开始计数,第二次相遇时停止计数。3.如何判断环的入口点:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。为什么呢?需要一个简单的计算过程: (1)当fast与slow相遇时,show肯转载 2016-07-27 15:32:07 · 399 阅读 · 0 评论 -
编程之美2.12--快速寻找满足条件的两个数
/*快速寻找满足条件的两个数--编程之美2.12*/#include <iostream>using namespace std;/*快速排序算法*/void swap(int a[], int i, int j){ int temp = a[i]; a[i] = a[j]; a[j] = temp; }int partition(int a[], int lo原创 2016-07-26 18:29:39 · 316 阅读 · 0 评论 -
递归和非递归的辗转相除法
#include using namespace std;int gcd(int m,int n){ while(n!=0) { int rem = m % n; m = n; n = rem; } return m;} int gcd1(int num1, int num2){ if(num1<num2) return gcd1(num2,num1);原创 2017-12-05 09:04:03 · 1706 阅读 · 0 评论