查找算法是从一个有序的数列中找到一个特定的数,常用于判断某个数是否在数列中,或者找到某个数在数列中的位置。
目录
一、顺序查找
顺序查找是最简单、最直接的查找算法,顺序查找是将数列从头到尾按照顺序查找一遍,是一种最没有技术含量、最容易理解的算法。
算法思想
静态查找是指只在数列中查找特定的数字,不对数列做任何的修改(但是可以进行排序),因此静态查找除了返回特定数是否存在,还可以返回这个特定数在数列中的下标。
动态查找是指在查找的同时还要进行插入或删除操作,动态查找只能返回特定数是否存在在当前数列中。
顺序查找属于静态查找,顺序查找是按照从头到尾的方法查找特定数的,所以也可以不用对数列进行排序,直接开始查找。但是为了样式的统一,比较不同的排序算法,我们还是采用有序数列,以iList数列为例,顺序查找最坏情况下需要查找了len(iList)次才能找到目标或者确定数列中没有目标。
举例
1.第一次查找
从iList数列的第一个数字iList[0]开始,比较它和特殊数是否相等。如果相等,就返回数字的下标并退出,否则比较数列中的下一个数字。
第一次比较结束,iList[0]和被查找数(特殊值)并不相等,下一步就要比较iList[1]和key的值是否相等。
2.第二次查找
Python中可以直接通过列表下标取出列表iList[1]的值跟key值相比较就可以。
显然iList[1]!=key,就需要继续往下比较,比较iList[2]和key值是否相等。需要一直比较直到iList[n]等于key返回数下标,或者一直比较直到结尾iList[-1]不等于key返回程序,通知key不再iList中。
3.第N次查找
在咱们这个简单的iList中,能够一眼就看出key是存在于iList中的,因此这里返回的值是iList.index(key),如下图所示:
经过第N次的查找,我们在数列中找到了与key相等的元素,返回这个元素的下标(在实际的使用当中数列中可能会有0个、1个或多个元素跟key相等。
源码
创建随机数列:randomList.py
import random
def randomList(n):
'''返回一个长度为n的整数列表,数据范围[0,1000) '''
iList = []
for i in range(n):
iList.append(random.randrange(1000))
return iList
if __name__ == "__main__":
iList = randomList(10)
print(iList)
用排序算法将随机数列排序,采用快排quickSort.py
from randomList import randomLsit
import timeit
iList = randomList(20)
def quickSort(iList):
if len(iList) <= 1:
return iList
left = []
right = []
for i in iList[1:]:
if i <= iList[0]:
left.append(i)
else:
right.append(i)
return quickSort(left) + [iList[0]] + quickSort(right)
if __name__ == "__main__":
print(iList)
print(quickSort(iList))
print(timeit.timeit("quickSort(iList)", "from __main__ import quickSort,iList", number=100))
快速查找算法:sequentialSort.py
from randomList import randomList
from quickSort import quickSort
import random
iList = quickSort(randomList(20))
def sequentialSearch(iList, key):
print("iList = %s" %str(iList))
print("Find The number : %d" %key)
iLen = len(iList)
for i in range(iLen):
if iList[i] == key:
return i
return -1
if __name__ == "__main__":
keys = [random.choice(iList), random.randrange(min(iList), max(iList))]
for key in keys:
res = sequentialSearch(iList, key)
if res >= 0:
print("%d is in the list, index is : %d\n" %(key, res))
else:
print("%d is not in the list\n" %key)
明天讲二分查找,欢迎点赞、关注、收藏~
可以订阅我的《算法设计与分析》专栏,【和我一起学算法】系列都会在这更新~