二分搜索法(附C语言实现)

本文介绍了一种高效的搜索算法——二分搜索法。该算法利用元素间的次序关系,在最坏情况下仅需O(logn)的时间复杂度即可完成搜索任务。文章详细解释了二分搜索的基本思想、递归实现方式,并通过一个具体的示例程序展示了如何在数组中查找目标元素的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        二分搜索法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。二分搜索法的应用极其广泛,而且它的思想易于理解,但是要写一个正确的二分搜索算法也不是一件简单的事。第一个二分搜索算法早在1946年就出现了,但是第一个完全正确的二分搜索算法直到1962年才出现。Bentley在他的著作《Writing Correct Programs》中写道,90%的计算机专家不能在2小时内写出完全正确的二分搜索算法。问题的关键在于准确地制定各次查找范围的边界以及终止条件的确定,正确地归纳奇偶数的各种情况,其实整理后可以发现它的具体算法是很直观的

#include <iostream>
using namespace std;
const int N = 101;
int quick_sort(int a[], int low, int high) {
    int i, j, temp;
    i = low;
    j = high;
    temp = a[i];
    if (low >= high) return 0;
    while (i < j) {
        while (i < j && a[j] > temp) j--;
        if (i < j) a[i++] = a[j];
        while (i < j && a[i] < temp) i++;
        if (i < j) a[j--] = a[i];
    }
    a[i] = temp;
    quick_sort(a, low, i - 1);
    quick_sort(a, i + 1, high);
    return 0;
}
int find(int n, int a[], int low, int high) {
    int mid = (low + high) / 2;
    if (a[mid] == n)
        return mid;
    else if (a[mid] < n)
        return find(n, a, mid + 1, high);
    else if (a[mid] > n)
        return find(n, a, low, mid - 1);
}
int main() {
    int a[N];
    int n, m;
    int i, j;
    int x;
    cout << "请输入数字个数(n)查找次数(m)";
    cin >> n >> m;
    cout << "请输入" << n << "个元素";
    for (i = 1; i <= n; i++) {
        cin >> a[i];
    }
    quick_sort(a, 1, n);
    cout << "请输入所需查找的" << m << "个对象";
    for (i = 1; i <= m; i++) {
        cin >> x;
        cout << x << "在序列中从小到大排";
        cout << find(x, a, 1, n);
        cout << "位";
        cout << endl;
    }
    system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值