二分查找法

1、基本思想:找出已知有序队列中与给定关键字相同的数的具体位置。原理是分别定义三个指针low,high,mid,分别指向待查元素所在范围的下界和上界及区间的中间位置,即mid=(low+high)/2,并让关键字与mid所指的数比较,若相等则查找成功并返回mid,若关键字小于mid所指的数则high=mid-1,否则low=mid+1,然后继续循环知道找到或找不到为止。

2、代码如下:

// FindMostMessage.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
using namespace std;

#define MAXSIZE 10

typedef struct{
    int list[MAXSIZE];
    int length;
}List;

int dichotomy_search(List s,int k)
{
    int low,mid,high;
    low=0;
    high=s.length-1;
    mid=(low+high)/2;
    while(high>low)
    {
        cout<<mid<<endl;
        if(s.list [mid]>k)//turn to the left part
        {
            high=mid-1;
            mid=(low+high)/2;
        }
        else if(s.list[mid] <k) //turn to the right part
        {
            low=mid+1;
            mid=(low+high)/2;
        }
        else
            return mid+1;//The key has been searched
    }
    return 0;//no such key
}

int main(int argc,char **argv)
{
    List s;
    int i,k,rst;
    int a[MAXSIZE]={1,3,6,12,15,19,25,32,38,87};
    for(i=0;i<MAXSIZE;i++)
    {
        s.list[i]=a[i];
    }
    s.length=MAXSIZE;
    printf("Input key number:");
    scanf("%d",&k);
    rst=dichotomy_search(s,k);
    if(rst==0)
        printf("Key:%d is not in the list!\n",k);
    else
        printf("The key is in the list,position is:%d\n",rst);
    return 0;
}

 

posted @ 2016-08-24 20:42  justDoIT&  阅读(164)  评论(0编辑  收藏  举报