搜索与排序—— 顺序查找与二分查找

Posted 鲸骑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搜索与排序—— 顺序查找与二分查找相关的知识,希望对你有一定的参考价值。

搜索与排序是计算中常常会出现的问题。本文我们主要研究搜索, 并且主要关注项是否存在集合中,返回项位序留给读者自行实现。

python中的搜索

  • 查询项是否存在: in关键字

 
   
   
 
  1. 'a' in ['a', 'b', 'c', 'd']

  • 查询项位序: index()方法

 
   
   
 
  1. l = [4, 2, 1, 7, 0, 6]

  2. l.index(1)

顺序查找

这个是最最基础, 也是最最没技术含量的查找了。

  • 代码实现:

 
   
   
 
  1. def sequentialSearch(alist, item):

  2.    pos = 0

  3.    found = False

  4.    while pos < len(alist) and not found:

  5.        if alist[pos] == item:

  6.            found = True

  7.        else:

  8.            pos += 1

  9.    return found

  • 时间复杂度:O(n)

  • 还有另外一种顺序查找针对已经排好序的集合,代这里不贴出,主要是因为时间复杂度与上述代码实现无差别。

二分查找

二分查找的条件为集合为有序(本文有序为从小到大排序, 从大到小原理相同)。主要原理是先从中间查找,如果该项为寻找的项,则完成查找。如中间项小于查找项, 则以起始项到中间项为新集合继续二分查找,中间项大于查找项的话, 以中间项与末尾项为新集合二分查找。

  • 代码实现:

 
   
   
 
  1. def binarySearch(alist, item):

  2.    first = 0

  3.    last = len(alist)-1

  4.    found = False

  5.    while first <= last and not found:

  6.        mid = (first + last) // 2

  7.        if alist[mid] == item:

  8.            found = True

  9.        else:

  10.            if alist[item] > item:

  11.                last = mid - 1

  12.            else:

  13.                first = mid + 1

  14.    return found

  • 代码实现2(递归版):

 
   
   
 
  1. def binarySearch(alist, item):

  2.    if len(alist) == 0:

  3.        return False

  4.    else:

  5.        mid = len(alist) // 2

  6.        if alist[mid] == item:

  7.            return True

  8.        else:

  9.            if alist[mid] > item:

  10.                return binarySearch(alist[:mid-1], item)

  11.            else:

  12.                return binarySearch(alist[mid+1:], item)

  • 复杂度:O(log^n)

  • 需要注意的是递归版本中, 切片花费的时间复杂度不为O(1)。



end



以上是关于搜索与排序—— 顺序查找与二分查找的主要内容,如果未能解决你的问题,请参考以下文章

排序与查找

列表查找及二分查找

c语言如何实现-数组排序,二分查找

算法----列表查找以及列表排序

搜索与排序

数据结构与算法笔记—— 查找算法(顺序查找二分法查找)