自学计算机也算有两年多了,自知比不得许多人的学习进度,尤是惭愧。但两年来计算机各种方面的书也是有所涉猎,虽学习的不深,但还是想跟大家分享自己的所学所得。在刚学计算机时,曾经天真的认为只要学好了代码就能成为一代大神,但学到深处才发现,代码语言只是一种工具,并没有很高的技术含量,猿们的差别往往在于编程思想上的差距。编程思想这个概念是很玄乎的,但其实真正表达出来是以算法为载体,算法能够很好的体现了我们解题的思维——编程思维
回想起自己曾经苦学算法的那段日子,可谓痛不欲生,尤其是常把算法书当做晚上的催眠书,效果一流。算法究竟有多重要?我举几个简单的例子:谷歌的搜索结果用快速排序算法进行排序;OC开发时,内部实现的代码使用了哈希排序查询的方式,好的算法能让我们事半功倍。但在现在的开发中,CPU已经足够快了,快到了即便两个程序员的算法时间差为10倍,我们也很难看出效果来。所以现在教育机构对算法的态度不是很好,但是想要成为一名优秀的程序员,我们就必须学会算法。在我看来,初学者可以通过学习算法提高自己对代码的理解以及应用,开发者可以通过优化算法让自己的程序跑的更快。算法的起始学习几乎都是排序方法,排序方法是非常有趣的东西,它完美的体现了将现实问题转化为逻辑/数学问题,从而使用计算机求解。那么这篇文章教给大家的也是从排序方法开始,本篇讲得是地精排序和桶式排序。
首先,什么是地精排序?地精排序又称侏儒排序,算法如其名,寻找出较小的元素依次放在相应的位置。这思路跟选择排序非常的相似,但是后者使用了两个下标进行比较,而地精排序仅仅使用一个下标,通过自增自减对比前后的元素进行对换位置排序。代码以C语言的形式图表示,主函数的代码:
排序具体算法:
输出结果:
地精排序从下标1开始,每次比较下标位置跟下标前一个位置的元素的大小,如果对换条件成立,则交换两个元素的值,下标自减一次。然后再比较当前位置和前一个位置的大小。如果交换条件不成立,下标自增。这种方式保证了在下标之前的元素排列中,小的元素总是在前面。
桶式排序。桶式排序跟哈希排序有着千丝万缕的关系,桶式排序实际上不能算的上是很好的排序方式。但对于查询来说,桶式排序后查询速度甚至可以用O(1)来表示,Ojbective-C本身内存管理的排序思想跟桶式排序的就很像。桶式排序的思想是花费大量的内存空间(如果有足够的空间)创建一个基于最长木板(要排序数组中的最大值)+1的动态数组,然后把每一个值当做组成木桶的一块木板,每有一个相同的值,木板长度增加。排序算法如下:
输出结果:
先对原数组进行一次遍历,寻找出最大值,然后创建一个最大值+1长度的数组并归零。再遍历一次原数组,将数组元素值作为下标,新数组下标对应位置的值每次+1.。最后遍历一次新数组把对应下标不为空的值依次存入原数组中。
算法是程序开发中的核心,学习算法并不见得可以对我们正常开发的程序提高很多性能,但这是去理解算法思维和往计算机更深一步学习的必经之路。