2021-05-25 数据结构排序专题【1】

2021-05-25 数据结构排序专题【1】: 顺序查找and二分查找(是个人就能想到的最朴素的查找方法)

顺序查找:

无序表以及有序表

二分查找:

问题:顺序查找虽然能够减少有序表的查找次数,但无法降低其数量级,有没有能够降低有序表查找数量级的方法?

1.顺序查找

思维理解:顾名思义,如果要在一个包里找出你想要的东西,这个包不是透明的,怎么找?那就是把东西一个又一个拿出来,找到了,就停,没找到继续。这是我们找东西最朴素的做法。

只不过如果想得更细的话,查找的过程中会分离成无序表和有序表两种情况。如果包里没这个东西呢?无序表那就是不由分说的一通乱找,直到看完了包里的所有东西,才能确定你要找的在不在包里。而有序表则不同,只要按照顺序,查找到了比目标大的数,那么就可以停止,不必再继续找了。

算法代码实现:

逐个遍历

2.二分查找

离开了最朴素的方法,我们试着去思考,有没有更快捷的方法,来帮助我们找到目标对象呢?

对于细分的两种情况,我们发现有无序表和有序表两种。先从比较容易入手的情况开始,有序表。前面我们讲到了有序表在查到了想要的目标后可以停止,如果目标不存在列表内,当读到比目标大的数时,就可以停止,其实这个过程本身是节约了查找次数。那么从查找次数入手,我们把这个单次次数扩大为一种规模的减少。那就有个想法,二分查找。

直接从一个列表的中间开始查找,如果中间正好对于目标对象,则可以停止。如果不是,则将中间的数与目标对象比较大小,如果大了,查前面;如果小了,查后半部分。接下来继续使用二分法,直到找到为止。

代码实现:

法一:指针

PS:学习一下这里的用first 和last标记,以及缩小范围的方法

法二:思考,能不能把代码写得更加简洁?二分查找其本质上就是个缩小问题规模量的问题,直到列表的长度变为0为止

递归

最小结束条件:

列表长度变为0,不存在任何元素

代码实现:


其他思考:

二分查找在时间复杂度上优于顺序查找,但是对数据项进行排序也是很大的开销,需要权衡是否值得。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容