7对分查找

'''
对分查找的概念
    对分查找又称二分查找,是一种高效的查找方法。对分查找的前提是,被查找的数据序列是有序的(升序,降序)

对分查找的基本思想
    对分查找的基本思想是在有序的数列中,首先将要查找的数据与有序数列内处于中间位置的数据进行比较,如果
    两者相等,则查找成功;否则就根据数据的有序性,再确定该数据的范围应该在数列的前半部分还是后半部分;
    在新确定的缩少范围内,继续按上述方法进行查找,直到找到要找的数据,即查找成功,如果要查找的数据不存
    在,即查找不成功。

对分查找的处理过程
    若key为查找键,数组a存放n个已按升序排序的元素。在使用对分查找时,把查找范围[i,j]的中间位置上的数据
    a[m]与查找键key进行比较,结果必然是如下三种情况之一:
        1若key<a[m],查找键小于中点a[m]处的数据。由a中的数据的递增性,可以确定:在(m,j)内不可能存在
        值为key的数据,必须在新的范围(i,m-1)中继续查找;
        2key=a[m],找到了需要的数据;
        3key>a[m],由与1相同的理由,必须在新的范围(m+1,j)中继续查找。
    这样,除了出现情况2,在通过一次比较后,新的查找范围将不超过上次查找范围的一半。
    中间位置数据a[m]的下标m的计算方法:m=(i+j)//2,或m=int((i+j)/2)

对分查找的程序实现
    1由于比较次数难以确定,所以用while语句来实现循环;
    2在while循环体中用if语句来判断查找是否成功;
    3若查找成功则输出查找结果,并结束循环(break);
    4若查找不成功,则判断查找键在数组的左关区间还是右半区间,从而缩小范围。

我们假设一个列表l = [12,17,23,25,26,35,47,68,76,88,96]
查找key=25
l = [12,17,23,25,26,35,47,68,76,88,96]
key=25
n = len(l)
i,j = 0,n-1
b = -1
while i<j:
    m = (i+j)//2
    if key == l[m]:
        b = m
        break
    elif key > l[m]:
        i = m + 1
    else:
        j = m - 1
if b == -1:
    print('没有找到')
else:
    print('找到%s在列表的%s的位置'%(key,b))

对分查找的查找次数的估算
    对元素规模为n的列表进行对分查找时,无论是否找到,至多进行了log2n + 1(log2n + 1表示大于等于log2n的最小整数)
    次查找就能得到结果,而使用顺序查找,在最坏的情况下(查找键在最后一个或不在列表内),需要进行n次查找,最好的情况是一次查找
    (查找的键在第一个),平均查找(n+1)/2数次。所以对分查找效率较高。
'''
l = [12,17,23,25,26,35,47,68,76,88,96]
key=25
n = len(l)
i,j = 0,n-1
b = -1
while i<j:
    m = (i+j)//2
    if key == l[m]:
        b = m
        break
    elif key > l[m]:
        i = m + 1
    else:
        j = m - 1
if b == -1:
    print('没有找到')
else:
    print('找到%s在列表的%s的位置'%(key,b))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中,对于一个数组进行二分查找,可以按照以下步骤进行: 1. 首先,需要确保数组是有序的。如果数组无序,需要先对其进行排序。 2. 然后,定义变量low和high,分别表示查找范围的起始和结束位置。初始时,low为0,high为数组长度减1。 3. 使用while循环进行迭代查找,直到low大于high时终止循环。 4. 在循环中,计算中间位置mid,可以使用以下公式:mid = (low + high) / 2。 5. 比较中间位置的元素与目标元素的大小关系: - 如果中间位置的元素等于目标元素,则已经找到,返回中间位置。 - 如果中间位置的元素大于目标元素,则目标元素在数组的前半部分,将high更新为mid - 1。 - 如果中间位置的元素小于目标元素,则目标元素在数组的后半部分,将low更新为mid + 1。 6. 如果循环结束仍未找到目标元素,则目标元素不存在于数组中。 以下是一个C语言中对数组进行二分查找的示例代码: ``` int binarySearch(int arr[], int n, int target) { int low = 0; int high = n - 1; while (low <= high) { int mid = (low + high) / 2; if (arr[mid == target) { return mid; // 找到目标元素,返回索引 } else if (arr[mid < target) { low = mid + 1; // 目标元素在后半部分 } else { high = mid - 1; // 目标元素在前半部分 } } return -1; // 目标元素不存在于数组中 } int main() { int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int target = 7; int size = sizeof(arr) / sizeof(arr<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C/C++语法基础](https://blog.csdn.net/weixin_52550583/article/details/120716648)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值