查找算法(二)二分搜索法

4 篇文章 0 订阅

二分搜索法适用于有序的数组,比如[1,3,5,7,9]这样的数组适合用二分搜索法查找元素。

假设存在一个数组为从小到大顺序排序。

二分思想:

(1)首先,我们视数组所有元素为当前查询范围

(2)拿当前查询范围中间的那个元素与要查元素比较,如果值想等,则查找成功,推出查找任务;如果值小于要查的那个元素的值,则取数组前半部分为当前查询范围;如果值大于要查的那个元素的值,则取数组前半部分为当前查询范围。

(3)重复步骤(2)。

实例代码:

//

//  main.cpp

//  BinSearch

//

//  Created by 胡士伟 on 16/6/8.

//  Copyright © 2016胡士伟. All rights reserved.

//


#include <iostream>

using namespace std;

int binSearch(int data[],int k,int n)  //二分搜索法

{

    int low=0,high=n-1;

    int mid;

    while(low<=high)

    {

        mid=(low+high)/2;

        if(data[mid]==k)

        {

            return mid;

        }

        else if(data[mid]>k)

        {

            high=mid-1;

        }

        else

        {

            low=mid+1;

        }

    }

    

    return -1;

    

}

void swap(int *a,int *b)  //交换两个数

{

    int temp;

    temp=*a;

    *a=*b;

    *b=temp;

}

void sort(int data[],int n) //冒泡排序,下沉法

{

    while(n>=0)  //最多n趟排序

    {

        for(int j=0;j+1<=n;j++)//n个元素两两比较

        {

            if(data[j]>data[j+1])

            {

                swap(data[j],data[j+1]);

            }

        }

        n--;

    }

}

int main(int argc,const char * argv[]) {

    // insert code here...

    int a[9]={44,23,36,57,24,58,2,5,0};

    int n=sizeof(a)/sizeof(a[0]);

    sort(a,n);

    cout<<"排序后的数组为:";

    for(int i=0;i<n;i++)

    {

        cout<<a[i]<<" ";

    }

    cout<<endl;

    cout<<"数组中总共有"<<n<<"个元素"<<endl;

    int s=binSearch(a,36,n);

    if(s>=0)

    {

        cout<<"查找成功!"<<endl;

        cout<<"位置在排序后数组的第"<<s<<"!"<<endl;

    }

    else

    {

        cout<<"查找失败";

    }

    return 0;

}

运行结果如下:

排序后的数组为:0 2 5 23 24 36 44 57 58 

数组中总共有9个元素

查找成功!

位置在排序后数组的第5!

Program ended with exit code: 0



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值