The Fun Of Algorithm - Day9 - 折半查找

问题描述

N个有序整数数列已放在一维数组中, 利用二分查找法查找整数m在数组中的位置。 如果找到,则输出其下标值,反之,则输出‘Not be found!’

问题分析

二分法只适用于有序序列

基本算法是:每次查找前先确定数组中待查的范围。假设指针low和high(low<high)分别知识待查范围的下届和上界,指针mid知识待查范围的中间位置,即mid=(low+high)/ 2 ,把m与中间位置mid上元素的值进行比较,如果m的值大于中间位置上的元素的值, 则下一次的查找范围放在中间位置之后的元素中;反之,下一次查找范围放在中间位置之前的元素中。直到low》high, 查找结束。

算法设计

按照取值范围可知指针low和high的初始值为0 和N-1, 除了三个指针变量low,high,mid之外,还需要一个变量假设为k来记录下标,利用变量k 的值来判断整数m是否在所给出的数组中。

Code

# !/user/bin/python3
# -*- coding: utf-8 -*-
# @author: HHVic
# @desc: 折半查找

import time

# add timer to calculate the performance
# Basic performance
###############################################################

start = time.time()


if __name__=='__main__':
    a=[-3,4,7,9,13,45,67,89,100,180]
    low=0
    high=len(a)-1
    k=-1
    print('a数组中的数据如下:')
    for i in a:
        print(i,end=' ')
    print()
    m=int(input('Enter m =:'))
    while low <= high:
        mid=(low+high)//2
        if m<a[mid]:
            high=mid-1
        else:
            if m>a[mid]:
                low=mid+1
            else:
                k=mid
                break
    if k>=0:
        print('m=%d,index=%d' %(m,k))
    else:
        print('Not be found!')




end = time.time()
print("The Basic Runtime is {0}".format((end-start)))

结果:

a数组中的数据如下:
-3 4 7 9 13 45 67 89 100 180 
Enter m =:100
m=100,index=8
The Basic Runtime is 5.093456268310547

问题拓展 - 顺序查找

# !/user/bin/python3
# -*- coding: utf-8 -*-
# @author: HHVic
# @desc: 折半查找

import time

# add timer to calculate the performance
# Basic performance
###############################################################

start = time.time()


if __name__=='__main__':
    a=[-3,4,7,9,13,45,67,89,100,180]
    k=-1
    print('a数组中的数据如下:')
    for i in a:
        print(i,end=' ')
    print()
    m=int(input('Enter m =:'))
    i=0
    while i<len(a):
        if m==a[i]:
            k=i
            break
        i+=1
    if k>=0:
        print('m=%d,index=%d' %(m,k))
    else:
        print('Not be found!')




end = time.time()
print("The Basic Runtime is {0}".format((end-start)))

结果:

python
a数组中的数据如下:
-3 4 7 9 13 45 67 89 100 180 
Enter m =:67
m=67,index=6
The Basic Runtime is 5.51863694190979
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值