算法导论之基础知识

相信很多同学都写过算法,包括简单的排序和项目中运用到的查找。很简单。可是真的有人认真的去练习过么。比如说如果现在让你默写一个排序,大部分的人都只会快排吧。但做为程序员的一项硬技能。算法必不可少,也许真正用的不多,但是不能不会。

虽然在项目中还没有问题是因为算法解决不了的。但是我还是决定去学习一下它。曾经比较自豪的是语法分析小算法。通过xml格式的数据分析过后生成 sql语句,还有字符串去重。


我至今已经学会了6、7种语言,给我的感觉就是语言相对来说真的只是工具(但我并不会放弃去学习并精通两门语言),只有伪代码才是思维的价值所在。


首先呢我们要先学会写伪代码

伪代码的约定

  1. 缩进表示块结构。例如,第1行开始的for循环体由第2~8行组成,第5行开始的while循环体包含第6~7行但不包含第8行。我们的缩进风格也适用于if-else语句。采用缩进来代替常规的块结构标志,如begin和end语句,可以大大提高代码的清晰性。
  2. while、for与repeat-until等循环结构以及if-else等条件结构与C、C++、Java、Python和Pascal中的那些结构具有类似的解释。不像某些出现于C++、Java和Pascal中的情况,本书中在退出循环后,循环计数器保持其值。因此,紧接在一个for循环后,循环计数器的值就是第一个超出for循环界限的那个值。在证明插入排序的正确性时,我们使用了该性质。第1行的for循环头为for j=2 to A.length,所以,当该循环终止时,j=A.length+1(或者等价地,j=n+1,因为n=A.length)。
  3. 当一个for循环每次迭代增加其循环计数器时,我们使用关键词to。当一个for循环每次迭代减少其循环计数器时,我们使用关键词downto。当循环计数器以大于1的一个量改变时,该改变量跟在可选关键词by之后。
  4. 符号“//”表示该行后面部分是个注释。
  5. 形如i=j=e的多重赋值将表达式e的值赋给变量i和j;它应被处理成等价于赋值j=e后跟着赋值i=j。
  6. 变量(如i、j和key)是局部于给定过程的。若无显式说明,我们不使用全局变量。
  7. 数组元素通过“数组名[下标]”这样的形式来访问。例如,A[i]表示数组A的第i个元素。记号“..”用于表示数组中值的一个范围,这样,A[1..j]表示A的一个子数组,它包含j个元素A[1],A[2],…,A[j]。
  8. 复合数据通常被组织成对象,对象又由属性组成。我们使用许多面向对象编程语言中创建的句法来访问特定的属性:对象名后跟一个点再跟属性名。例如,数组可以看成是一个对象,它具有属性length,表示数组包含多少元素,如A.length就表示数组A中的元素数目。
  9. 我们把表示一个数组或对象的变量看做指向表示数组或对象的数据的一个指针。对于某个对象x的所有属性f,赋值y=x导致y.f等于x.f。进一步,若现在置x.f=3,则赋值后不但x.f等于3,而且y.f也等于3。换句话说,在赋值y=x后,x和y指向相同的对象。
  10. 我们的属性记号可以“串联”。例如,假设属性f本身是指向某种类型的具有属性g的对象的一个指针。那么记号x.f.g被隐含地加括号成(x.f).g。换句话说,如果已经赋值y=x.f,那么x.f.g与y.g相同。
  11. 有时,一个指针根本不指向任何对象。这时,我们赋给它特殊值NIL。
  12. 我们按值把参数传递给过程:被调用过程接收其参数自身的副本。如果它对某个参数赋值,调用过程看不到这种改变。当对象被传递时,指向表示对象数据的指针被复制,而对象的属性却未被复制。例如,如果x是某个被调用过程的参数,在被调用过程中的赋值x=y对调用过程是不可见的,然而,赋值x.f=3却是可见的。类似地,数组通过指针来传递,结果指向数组的一个指针被传递,而不是整个数组,单个数组元素的改变对调用过程是可见的。
  13. 一个return语句立即将控制返回到调用过程的调用点。大多数return语句也将一个值传递回调用者。我们的伪代码与许多编程语言不同,因为我们允许在单一的return语句中返回多个值。
  14. 布尔运算符“and”和“or”都是短路的。也就是说,当求值表达式“x and y”时,首先求值x。如果x求值为FALSE,那么整个表达式不可能求值为TRUE,所以不再求值y。另外,如果x求值为TRUE,那么就必须求值y以确定整个表达式的值。类似地,对表达式“x or y”,仅当x求值为FALSE时,才求值表达式y。短路的运算符使我们能书写像“x≠NIL and x.f=y”这样的布尔表达式,而不必担心当x为NIL时我们试图求值x.f将会发生什么情况。
  15. 关键词error表示因为已被调用的过程情况不对而出现了一个错误。调用过程负责处理该错误,所以我们不用说明将采取什么行动。
下面是我看完书自己写的一个插入排序,只要记住思想,如果平常代码量够,那么算法自然就出来了

	private static  void Insertsort(int a[]){
		for (int i = 1; i < a.length; i++) {
			int key=a[i];
			int j=i-1;
			while(j>=0&&a[j]<=key){
				a[j+1]=a[j];
				j--;
			}
			a[j+1]=key;
		}
	}
相比之下,可能比快排代码还少,而且算法复杂度也有所降低哦~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值