本人大四即将结束,于2018年12月18日购《算法导论》这本书,慢慢看,第一阶段先主要理解各个章节说的算法都是什么意思,书上的课后习题先不做,用得上什么算法我再详细学习。这是官方课后答案的链接。
放在开头:没有好的算法,坏的算法之说,重点是针对不同的情况,针对不同的数据,针对不同的需求,去选择算法,改良算法。我的数学功底不强,太难的公式我看不懂,太高深的思想我理解不了,我主要以应用为主,不以解释数学公式为主。
之前介绍的都是比较排序,就是看两个元素谁比谁大。现在介绍几种新的算法,计数排序,基数排序,桶排序。
计数排序
真的完全没有比较的痕迹。完全就是计数。
第一步:统计每个数字都出现了多少次,没有出现的数字记为0次。
第二步:得到每个数出现过几次这么一个数组(数组下标是数字,数组下标对应的元素是出现的次数),然后从低到高累加,得到一个新的数组,这个数组记载了整个要排序的数据中,比当前数据小于或者等于的数有多少个。
第三步:生成一个新的数组(跟原始数组一样大),我们现在开始将原数组中的数据一个一个的放入新的数组中,放入的位置就是计数数组下标中的数。并且放入一个数后,这个计数数组的下标就减1,直到把所有的原数组数据过一遍。
总结一下:计数排序的优点就是时间复杂度小,缺点就是空间复杂度大,前前后后,新建了两个数组。
基数排序
这个理解起来简单,就是日期排序的思想,先年,年份一样,再月份,然后具体是哪个日期。
举例:对于若干个n位数,先只看个位,个位从小到大排,然后看十位,然后百位,以此类推。
桶排序
这个也很简单。上面的基数排序是按照哪一位分区(个位十位百位。。。),这个就是按数的区间划分。
例如有一堆0~1的小数。就分十份区间,0~0.1区间,0.1~0.2区间。。。。
先把数据放入对应的区间里面,然后再给每个区间再排序。