学代码的机器思维与排序算法

看来连续更新还是并不容易的,昨天就忘了写了:(

我最先学的是C语言,用的书是谭浩强那本,当时看的时候也没觉得像后来网上评论的那么差。一直到现在,我也觉得这本书还是可以作为入门书的。

初学者觉得难,实际是因为思维不够机器。因为从小都是与人打交道,在第一次接触编程的时候,思维方式与电脑差异太大,所以磨合起来特别的不舒服,即觉得编程难。

电脑的特点就是,它比人笨得多。必须把程序写的无歧义,它才可以正确执行,它不会模糊理解,而唯一的反馈就是给出错误结果。

刚学编程的时候,很多精力实际是花在适应电脑的这个特点上了。

比如排序,19375,人的办法是选择排序,两步就行,先把最大的9挪到最后,再把7放到5与9中间,就成了13579,排完了。

但电脑是没法一下子看出9最大,它找出最大的数字必须遍历比较。它可以依次选最大的,第二大的,等等,但先要有个遍历算法,复杂度为O(N)。

这么一搞,效率就成了O(N^2),还不如冒泡排序呢,因为选完之后留下的空位怎么办,又该往哪里放?把它和最后一个交换,这属于变相的冒泡:(

相当于证明了这两个是等价的:(

之后,算法专家们就搞出来了一个快速排序。使用分而治之的办法,先选一个数,把比它大的放在右边,比它小的放在左边,然后左右两边分别排序。用的办法,也是继续分而治之,直到分的只有1个数,那就排好了。

这样,每次就只需要与选出来的标准比较就行了。

每一轮大约比较N次,二分法,分的次数大约是logN(计算机默认以2为底数),复杂度为O(N logN)。

N不一定正好是2的几次幂,复杂度的估算也不需要特别精确,只要精确到数量级就行。

算法的性能比较,也是基于数量级的比较。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容