通过python学习算法
我微软的忠实粉丝,从进入码农这个行业一直都在C#语言,.net平台,asp.net这个框架。过年回家家里有弟妹已经升初中了,学习相当紧张,但是我还是想要跟他们说要他们学习一门编程语言,不为什么可能想把他们也带入坑里面。他俩一直要我做他们的老师,教他们学习,哎看来是把我自己带入坑里面了,不过为了他们的学习之路我同意了。 对于最近流行的编程语言和一些政策信息我最终决定要教他们学习Python,正好我也换换思维,学习一下这个被码农们一直推崇的语言。
其实学习也是需要有一定的目的性,带着目的性对于一个码农来说也会在自己的编程技术上有进一步的提高(我的个人想法)。正好最近我在研究算法,给自己的目标每日一类算法。于是我就用python来实现各种算法,这样既能学习这门语言也能达到我的目的。
归并排序这是我今天的第一道算法题,原理:
归并算法基本思想是依据分治法来解决问题,1.分解:把长度为n的序列分解为n/2个序列。2.治理:对每个子序列分别调用归并排序,进行递归操作。当子序列长度为1时,序列本身有序,停止递归。3.合并:合并每个排序好的子序列。
码农最主要还是代码
1 class MergeAlgorithm: 2 #将两个有序序列合并。 3 def mergearray(self,first,last): 4 temp=[] 5 i=0 6 j=0 7 8 while j<len(first) and i<len(last): 9 if first[j]<last[i]: 10 temp.append(first[j]) 11 j+=1 12 else: 13 temp.append(last[i]) 14 i+=1 15 16 if j==len(first): 17 for h in last[i:]: 18 temp.append(h) 19 else: 20 for h in first[j:]: 21 temp.append(h) 22 23 return temp 24 25 def mergesort(self, lists): 26 if len(lists) <= 1: 27 return lists 28 mid =int(len(lists) / 2) 29 left = mergesort(lists[0:mid]) 30 right = mergesort(lists[mid:len(lists)]) 31 return mergearray(left, right)
这种写法就是按照C#的方式定义的类,然后调用,但是出现问题了
什么鬼连自己的方法都不能用,哎看来我真的是在一种思维里面陷入的太深了。看看上面定义函数的时候发现参数里面多了一个self,在使用pycharm这个IDE自动显示出来,让我很郁闷最后查了一下关于这个关键字的用意"self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类",参考http://www.runoob.com/python/python-object.html。对于我这个低智商的码农看了好久也没明白,根据报的错误我在方法前面加上"MergeAlgorithm."不报错了但是点击运行再次悲催了,
如果又再次找度娘查原因,还是没有解决。最后还是回归到那句话"self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类",于是把类改成"self.",再次运行,oh,我的天了居然成功了。而且输出正确的结果
就这么一点玩意折腾我半天了,看来我这个码农还真的是个码农啊。后面的路很长还在进一步研究,而且教小孩是一个很庞大的工程,一不小心就会误人子弟啊,所以是一定要小心加认真加尽责,就像我们对待每一份工作一样。