【和我一起学算法】查找篇——顺序查找

查找算法是从一个有序的数列中找到一个特定的数,常用于判断某个数是否在数列中,或者找到某个数在数列中的位置。

目录

一、顺序查找

算法思想

举例

1.第一次查找

 2.第二次查找

 3.第N次查找

源码


一、顺序查找

顺序查找是最简单、最直接的查找算法,顺序查找是将数列从头到尾按照顺序查找一遍,是一种最没有技术含量、最容易理解的算法。

算法思想

静态查找是指只在数列中查找特定的数字,不对数列做任何的修改(但是可以进行排序),因此静态查找除了返回特定数是否存在,还可以返回这个特定数在数列中的下标。

动态查找是指在查找的同时还要进行插入或删除操作,动态查找只能返回特定数是否存在在当前数列中。

顺序查找属于静态查找,顺序查找是按照从头到尾的方法查找特定数的,所以也可以不用对数列进行排序,直接开始查找。但是为了样式的统一,比较不同的排序算法,我们还是采用有序数列,以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)

明天讲二分查找,欢迎点赞、关注、收藏~

可以订阅我的《算法设计与分析》专栏,【和我一起学算法】系列都会在这更新~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二琳爱吃肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值