2022-06-19 05:28来源:m.sf1369.com作者:宇宇
真正是新手的话,我想哪一本书都不值得推荐。问这个问题,应该更注重的是如何学习,而不是哪一本书。
现在随便一本书估计都好几百页,很厚很厚。就算你有足够的耐心一点一点啃掉它,等你学完也已经好长时间过去了,绝大部分想学习c语言的新手都在这里被劝退了。
c语言也只是一种工具,最重要的是先学会使用它。深入它的原理应该在有较为全面的认识后进行。就像电脑一样,使用它很愉快,但要是一开始就给你一本书,让你一点点了解它,再顺着计算机原理,如何开机,如何登陆,如何使用鼠标这样的路线开始,估计就没那么愉快了。
现在网络资源很多,随便找找资料,就能够知道如何搭建自己的编程环境,写一些简单的程序。能看到自己的程序运行,产生效果,才会有成就感,继续学下去,对不对。
等你感觉c语言也不过如此时,或者计划深入学习时,才是开始学习c语言细节的时候,这时你才能明白c语言为何如此,带着你之前的实践经验去学,才是收获最大的。
至于选择哪一本书,太简单了,现在随便一本畅销书都可以,都是差不多的。
入门,如果选书的话,应该选择简单易懂的书,最好薄一点,通常大学里面C语言教程都比较适合入门。一上来就《C Primer Plus》这些大部头是非常不建议的,这种书不建议通读,作为工具书反而比较合适。
学习一门语言应该是先从大体上对它有点认识,然后逐步深入。入门不要死扣细节钻牛角尖。
关键还是多练习,平时可以试想是否可以开发一些小工具来辅助工作和学习,培养程序员的思维方式。
当你能对基本语法熟悉的时候,可以阅读操作系统原理有关的书,毕竟C和操作系统是息息相关的,同时可以看看别人写的代码,自己试着调试,不明白的可以翻翻大部头或者网上搜索一下。
最后提醒,有些程序员喜欢用一些偏僻冷门的语法来表示自己的高深,请不要这样子做,第一,这样容易露怯,真正高手不需要这样的伎俩;第二,你的同事和上司会很不喜欢,这样的代码不易读,就不容易维护,甚至过了若干时间,你自己都不明白什么意思就尴尬了。高级编程语言能出现,其中一个原因就是为了避免晦涩难懂,简洁干净易懂的程序才是程序员应该写的。
谢邀。
我的上个回答简要讨论了下什么是算法,并且介绍了C语言程序开发中比较基本的数组排序算法——插入排序法,如果题主看了,应该有助于理解本题。
事实上,让C语言编程具有魅力的是算法,拿到问题,能够设计出解决方案并且完成代码的是程序员,只会按照步骤编码的是码农。
这是上个回答的主题,有朋友看到也有感而发:在评论区说,“程序是骨架,算法才是灵魂”。的确,C语言程序只是指令,计算机只会冷冰冰的按照指令办事,它并不能解决问题,真正解决问题的还是人。
什么样的算法才是好的算法呢?假设计算机是无限快的,并且存储器是免费的无限大的,那最好的算法就是最容易实现的算法。
然而,计算机也许是快的,但它们不是无限快。存储器也许是廉价的,但不是免费的。所以计算时间是一种有限资源,存储器的空间也一样。优秀的程序员应该尽力设计出开销更小的算法。
下面再讨论下C语言程序开发中,数组的归并排序算法,这种算法也是比较经典的排序法,在数组元素非常多的情况下,效率远远高于插入排序法。
什么是归并排序呢?归并排序的定义,希望了解“一本正经”的官方书面定义可以自行百科。这里就不写了,因为“冷冰冰的”书面定义对不了解它的人来说太难懂。
我打算用一些容易理解的例子来解释它。假设有一个C语言数组需要排序,那数组长度为多长最简单呢?显然是长度为 1 时,排序最简单,什么都不需要做,就能够排好序。
归并排序的基本思路就是这样:把长数组一直拆分下去,直到最后不能拆分为止,这时长数组被拆分为若干个长度为 1 的数组,长度为 1 的数组显然是排好序的了。
例如下图是一个长度为 5 的数组,为了排序,先把它拆分到不能继续拆为止。
接着,只要把这些排好序的子数组按照从小到大的顺序合并,就可以得到最终排好序的数组了。
好了,现在知道归并排序的算法了,那怎样使用 C语言编程完成这个算法呢?
使用C语言编程实现归并排序算法归并排序算法总体可以分为两步:拆分数组,合并数组。先来看看怎样使用C语言实现数组的拆分。
使用C语言拆分数组对数组拆分有多种方法,这里选择平分法。
如果使用 start 表示数组头,end 表示数组尾,每次平均拆分,都会将数组分为 start 到 mid,和 mid+1 到 end 两部分,其中 mid 表示中间点,所以 mid = (start+end)/2。就这样一直拆分下去,直到不能继续拆分为止。
不能拆分时,start 应该不再小于 end。拆分数组的数学描述完毕了,容易看出,递归(如果题主对C语言的递归不理解,可以查看我之前的问答或者文章。)非常适合解决这样的问题。我们现在用C语言来实现这样的拆分,先确定递归的基础条件:
拆分过程会在 start 不再小于 end 时停下。其他情况时,拆分会继续下去,相关C语言代码如下,请看:
divide(start, mid); 负责拆分前半段,divide(mid+1, end); 负责拆分后半段。这样的 divide 函数可以把数组拆分到不可拆分为止。
使用C语言合并数组使用 divide 函数把数组拆分完毕后,就可以按照从小到大的顺序把各个元素合并到原来的数组了。
由于两个子序列都已经排好序了,所以 merge() 函数的C语言代码很简单,每次循环取两个子序列中最小的元素进行比较,将较小的元素取出放到最终的排序序列中,如果其中一个子序列的元素已取完,就把另一个子序列剩下的元素都放到最终的排序序列中。
使用C语言实现数组的归并排序数组的拆分和合并函数都写好了,可以把它俩结合起来,实现数组的排序了。
测试C语言实现的归并排序这里使用 8 个元素的数组做测试:
编译并执行这段C语言代码,发现数组被成功排序了。
到这里,相信题主应该明白如何使用C语言实现数组的归并排序了。它和插入排序算法都属于排序算法,但是二者的效率差异性却很大。
程序员一般如何衡量算法的效率呢?数组的插入排序法和归并排序法的效率差异性到底有多大呢?我之前的文章已经比较详细的讨论过,题主可以点击我的主页查看。
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。
学习算法是有基础要求的,尤其是一些复杂的算法,比如:离散数学,数理逻辑,数据结构等,所以学习算法肯定会觉得难。算法的好坏评估标准通俗的讲就是效率高低,不仅包括时间效率,还包括空间效率。算法学习建议先学习一些简单的,再逐步深入。