
【算法设计】
空空的司马
微信搜『程序员加油站』,回复『pdfs』获取优质电子书
展开
-
最大公约数和最小公倍数
1、最大公约数最大公约数就是两个数共同的因子中,最大的那一个。百度百科上搜到一个算法流程图:根据上述算法流程图可以写得如下的代码:int gcs(int a, int b){ int r; if(a < b) //确保a比b大 { r = a; a = b; b = r; } r = b; while(r != 0) { r = a%b;原创 2016-03-07 20:54:25 · 3576 阅读 · 1 评论 -
分治策略(最差情况下查找为线性时间算法)
线性时间选择算法在最差的情况下的时间复杂度是O(n^2),这个算法就是为了优化这一点而诞生的。算法的整体思想基本相似,优化的关键点在于分割点的选择。首先上一张草图。 首先将数组按照顺序,每5个组成一组。上图中数组是按竖着的顺序排列的。对每一个组排序,并将中位数取出存到额外的一个序列里面; 然后在去对这个额外的序列去分割成5个5个的组,再去求原创 2015-11-03 14:47:55 · 2042 阅读 · 0 评论 -
分治策略(期望线性时间选择)
1、算法思想线性时间选择算法的思想和快速排序的思想基本一致,都是将基于序列分割完成的。算法步骤:2、代码实现#include using namespace std;/*********************************************************************** Input: a[]:待原创 2015-10-30 14:29:42 · 1831 阅读 · 0 评论 -
分治策略(归并排序)
【问题描述】将n个无大小顺序的数,按照大小排序。【算法思想】将待排序元素分成大致相同的两组,分别对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。#include using namespace std;int a[11] = {9,8,4,65,21,31,6,17,101,11,52};int b[11];template void Merge(T原创 2015-03-11 09:43:15 · 1501 阅读 · 0 评论 -
分治策略(棋盘覆盖)
【问题描述】 在一个2^k×2^k个方格组成的棋盘中,有一个方格与其他方格不同,称该方格为一特殊方格,并称该棋盘为一个特殊棋盘。显然特殊方格在棋盘上出现的位置有4^k种情形。因而对任何k≥0,有4^k种不同的特殊棋盘。棋盘如图所示:现在要求使用下面四种骨牌填充整个区域【算法思路】 先确定特殊方格的位置,也就是将大的棋牌分割成四块之后的原创 2015-03-08 16:22:36 · 1266 阅读 · 0 评论 -
分治策略(汉诺塔、二分查找)
1、 汉诺塔问题【问题描述】有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动,设移动次数为H(n)。【问题分析】先考虑两个盘子时的情况,只有两个盘子的时候只需要将上面的盘子移到C柱子上,然后将下面的盘子移动到B柱子上,再将C柱子上的盘子移原创 2015-03-08 11:54:45 · 2010 阅读 · 0 评论 -
分治策略(递归,排列问题)
1、递归概念 直接或者间接调用自身的算法叫做递归算法。用函数自身给出定义的函数称为递归函数。有些数据结构,比如二叉树等,由于自身固有的递归特性,特别适合用递归来描述。 递归算法结构清晰,可读性强,且容易用数学归纳法证明算法的正确性。但是递归算法无论从耗费的时间还是从占用的空间角度看,递归算法的效率都比较低。所以常常在递归算法消除递归调用。 分治策略的思原创 2015-03-05 17:40:01 · 2608 阅读 · 0 评论 -
数据高低位交换
一、容易想到的方法unsigned char shift_fun1(unsigned char data) { unsigned char i; unsigned char tmp=0x00; for(i=0;i<8;i++) { tmp=((data>>i)&0x01)|tmp; if(i<7)原创 2016-10-25 17:24:44 · 4793 阅读 · 0 评论 -
算法学习 - 快速排序相关
1. 划分快速排序中最重要的步骤就是划分,即选择一个元素(很多地方称为枢纽元素),将序列划分成两部分,比枢纽元素大的放在枢纽元素的右边,比枢纽元素小的放在枢纽元素的左边。划分函数的思想:1. 选择一个枢纽元素(以选择序列的第一个元素为例),暂存到临时变量中2. 从序列的右边向左查找,找到一个比枢纽元素小的值。若找到,则将这个值填入到枢纽元素的位置3. 从序列的左边向右查找,找到原创 2016-08-31 10:18:13 · 1309 阅读 · 0 评论 -
算法学习(7) - 排序算法大集合
该篇博文长期更新,如有错误或者建议请评论留言,方便相互交流学习,谢谢。 1. 基本概念1.1 稳定性稳定算法: 排序序列中假设有几个比较关键词相等的元素,那么排序后这几个元素的前后相对位置不发生变化。不稳定算法: 不能保证上述过程的算法称为不稳定算法。算法的稳定性对于有些应用中比较重要。1.2 时间性能排序是数据处理中经常执行的一种操作,时间开销是衡量排序算法的一个重要标志。通常原创 2016-06-02 17:04:22 · 1269 阅读 · 0 评论 -
牛顿迭代法求解方程
说明:该片博客源于博主的早些时候的一个csdn博客中的一篇,由于近期使用到了,所以再次作一总结。原文地址概述牛顿迭代法(Newton’s method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。1. 牛顿迭代公式设r r 是 f(x)=0 f(x) = 0 的根,选取 x0 x_{0} 作为r原创 2016-08-03 14:02:35 · 25898 阅读 · 0 评论 -
大数相乘
输入:两个字符串表示的大数(正整数),大数的含义是指超过了C++内嵌的数据类型(int,long等等)。输出:两个数进行乘法的结果。/*输入两个数字表示的字符串,计算其乘法的结果*/#include #include using namespace std;char* GetMUL(const char* a, const char* b){ int *pRt原创 2016-04-04 16:18:57 · 969 阅读 · 0 评论 -
分治策略(快速排序)
【算法思想】快速排序的基本思想是对输入的子数组a[p:r],按照以下三个步骤进行排序:【实现代码】#include using namespace std;template inline void Swap(Type a,Type b){ Type tmp = a; a = b; b = tmp;}template int Find(Type原创 2015-03-17 21:19:35 · 2185 阅读 · 0 评论