对分查找算法及实现

二分查找算法基本思想
二分查找算法
的前置条件是,一个已经排序好的序列(在本篇文章中为了说明问题的方便,假设这个序列是升序排列的),这样在查找所要查找的元素时,首先与序列中间的元素
进行比较,如果大于这个元素,就在当前序列的后半部分继续查找,如果小于这个元素,就在当前序列的前半部分继续查找,直到找到相同的元素,或者所查找的序
列范围为空为止.

/* 二分查找
 * 算法思想:1、将数组排序(从小到大);2、每次跟中间的数mid比较,如果相等可以直接返回,
 * 如果比mid大则继续查找大的一边,否则继续查找小的一边。

  输入:排序好的数组 - sSource[],数组大小 - array_size,查找的值 - key
  返回:找到返回相应的位置,否则返回-1
*/
int BinSearch(int sSource[], int array_size, int key)
{
    int low = 0, high = array_size - 1, mid;

    while (low <= high)
    {
        mid = (low + high) / 2;//获取中间的位置

        if (sSource[mid] == key)
            return mid;    //找到则返回相应的位置
        if (sSource[mid] > key)
            high = mid - 1;    //如果比key大,则往低的位置查找
        else
            low = mid + 1;    //如果比key小,则往高的位置查找
    }
    return -1;
}

C语言二分查找法(指针和数组实现)

/*
 * 编写一个函数,对一个已排序的整数表执行二分查找。
 * 函数的输入包括各异指向表头的指针,表中的元素个数,以及待查找的数值。
 * 函数的输出时一个指向满足查找要求的元素的指针,当未查找到要求的数值时,输出一个NULL指针
 * 用两个版本实现,一个用的是数组小标,第二个用的是指针
 * 他们均采用了不对称边界
 *
Copyright (c) 2012 LiMing
Author:        LiMing
2012-06-21
referenced C Traps and Pitfaills Chinese Edition
Page 132-137
 *
 * 查找的元素为x,数组下表是k,开始时0 <= k < n
 * 接下来缩小范围lo <= k < hi,
 * if lo equals hi, we can justify the element "x" is not in the array

 * */
#include <stdio.h>

int array[] =
{
    0,1,2,3,4,5,6,7
};

int *bsearch_01(int *t, int n, int x);

int *bsearch_01(int *t, int n, int x)
{
    int lo = 0;
    int hi = n;

    while(lo < hi)
    {
        //int mid = (hi + lo) / 2;
        int mid = (hi + lo) >> 1;

        if(x < t[mid])
            hi = mid;
        else if(x > t[mid])
            lo = mid + 1;
        else
            return t + mid;
    }
    return NULL;
}

int *bsearch_02(int *t, int n, int x);

int *bsearch_02(int *t, int n, int x)
{
    int lo = 0;
    int hi = n;

    while(lo < hi)
    {
        //int mid = (hi + lo) / 2;
        int mid = (hi + lo) >> 1;
        int *p = t + mid;        //用指针变量p存储t+mid的值,这样就不需要每次都重新计算

        if(x < *p)
            hi = mid;
        else if(x > *p)
            lo = mid + 1;
        else
            return p;
    }
    return NULL;
}

//进一步减少寻址运算
/*
 * Suppose we want to reduce address arithmetic still further
 * by using pointers instead of subscripts throughout the program.
 *
 * */
int *bsearch_03(int *t, int n, int x);

int *bsearch_03(int *t, int n, int x)
{
    int *lo = t;
    int *hi = t + n;

    while(lo < hi)
    {
        //int mid = (hi + lo) / 2;
        int *mid = lo + ((hi - lo) >> 1);

        if(x < *mid)
            hi = mid;
        else if(x > *mid)
            lo = mid + 1;
        else
            return mid;
    }
    return NULL;
}

/*
 * The resulting program looks somewhat neater because of the symmetry
 * */
int *bsearch_04(int *t, int n, int x);

int *bsearch_04(int *t, int n, int x)
{
    int lo = 0;
    int hi = n - 1;

    while(lo <= hi)
    {
        //int mid = (hi + lo) / 2;
        int mid = (hi + lo) >> 1;

        if(x < t[mid])
            hi = mid - 1;
        else if(x > t[mid])
            lo = mid + 1;
        else
            return t + mid;
    }
    return NULL;
}

int main(int argc, char **argv)
{
    int * ret = NULL;
    int *ret2 = NULL;
    int *ret3 = NULL;
    int *ret4 = NULL;

    ret = bsearch_01(array, 8, 3);
    ret2 = bsearch_02(array, 8, 6);
    ret3 = bsearch_03(array, 8, 4);
    ret4 = bsearch_04(array, 8, 2);
    printf("The result is %d\n", *ret);
    printf("The result is %d\n", *ret2);
    printf("The result is %d\n", *ret3);
    printf("The result is %d\n", *ret4);

    printf("hello world\n");
    return 0;
}

递归方法

int BinSearch(int Array[],int low,int high,int key/*要找的值*/)
{
    if (low<=high)
    {
        int mid = (low+high)/2;
        if(key == Array[mid])
            return mid;
        else if(key<Array[mid])
            return BinSearch(Array,low,mid-1,key);
        else if(key>Array[mid])
            return BinSearch(Array,mid+1,high,key);
    }
    else
        return -1;
}

非递归方法

int BinSearch(int Array[],int SizeOfArray,int key/*要找的值*/)
{
    int low=0,high=SizeOfArray-1;
    int mid;
    while (low<=high)
    {
        mid = (low+high)/2;
        if(key==Array[mid])
            return mid;
        if(key<Array[mid])
            high=mid-1;
        if(key>Array[mid])
            low=mid+1;
    }
    return -1;
}
时间: 2024-12-30 12:14:07

对分查找算法及实现的相关文章

算法-对分查找(二分查找)C++实现

这个是个基本的查找算法,因为只是把数读入就需要(N)的时间量,因此我们在说这类问题的时候都是假设读入过的. 在算法常用的时间,将问题缩小为一部分(大约1/2),那么我们就认为这个算法是O(logn)级别的. 先说下对分查找的时间复杂度为O(logn) 前提是已经拍序好的数列. // // main.cpp // binarySearch // // Created by Alps on 14-7-24. // Copyright (c) 2014年 chen. All rights reserv

查找算法(I) 顺序查找 二分查找 索引查找

查找 本文为查找算法的第一部分内容,包括了基本概念,顺序查找.二分查找和索引查找.关于散列表和B树查找的内容,待有空更新吧. 基本概念 查找(search)又称检索,在计算机上对数据表进行查找,就是根据所给条件查找出满足条件的第一条记录(元素)或全部记录. 若没有找到满足条件的记录,则返回特定值,表明查找失败:若查找到满足条件的 第一条记录,则表明查找成功,通常要求返回该记录的存储位置或记录值本身,以便进行进一步处理:若需要查找到满足条件的所有记录,则可看做在多个区间内连 续查找到满足条件的第一

模板实现查找算法

使用模版实现顺序查找和对分查找,遇到的问题: 1.class和typename的区别 声明模板参数时,class和typename关键字等价,可以互换:(早期的C++标准中,模版参数的关键字是通过class来标识的,后引入typename关键字.typename关键字本质上是标识一个类型,所以在模版参数定义时可以代替class.) 用作“嵌套依赖类型名”,必须用typename关键字标识:(例外:继承列表/成员初始化列表中的基类初始化时,可以不用typename标识“嵌套依赖类型名”,因为编译器

对分查找法(二分查找法,折半查找法)

二分查找法是针对已经排好序的序列进行查找 每次折半查找 算法时间复杂度,对于长度为N的序列,每次执行N/2,假设k次结束,最后到第一个N/2^k=0,所以k=logN 时间复杂度logN int binarysearch(const int array[], int x, int N) { int low, mid, high; low = 0, high = N - 1; while (low <= high) { mid = (low + high) / 2; if(array[mid] <

排序、查找算法

1> 插入排序 //插入排序(把第一个当作也排好序,然后对后面的依次插入到已排好序的队列中)平均时间复杂度0(n^2) public void insertSort(int[] a){ for(int i = 1;i<a.length;i++){ for(int j = i;j > 0;j--){ if(a[j] < a[j-1]){ int tmp = a[j]; a[j] = a[j-1]; a[j-1] = tmp; } } } } 2> 希尔排序 /*希尔排序:平均时

二分查找算法的 JavaScript 实现

二分查找在查找[指定值]在[有序]数据中的[位置]时是一种高效的算法. 以下仅提供 ES5 版本. var arr = [0, 2, 4, 27, 28, 54, 67, 74, 75, 79, 86, 97, 289, 290, 678] function binarySearch(arr, val) { var start = 0, end = arr.length - 1; while (start <= end) { var mid = Math.floor((start + end)

Java学习 (七)、数组,查找算法,二分查找法,冒泡排序,选择排序,插入排序

一.常用数组查找算法 工作原理:它又称为顺序查找,在一列给定的值中进行搜索,从一端的开始逐一检查每个元素,知道找到所需元素的过程. 例1:查找指定的数在数组中出现的位置,找到返回下标,找不到返回-1 1 import java.util.Scanner; 2 public class LinearSearch{ 3 public static void main(String []argas) 4 { 5 int [] array={10,100,90,65,80,92}; 6 System.o

算法_001_二分查找算法

 二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:     1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,    2.寻找{6, 7, 8, 9}的中位数,为7,7>

Java学习之二分查找算法

好久没写算法了.只记得递归方法..结果测试下爆栈了. 思路就是取范围的中间点,判断是不是要找的值,是就输出,不是就与范围的两个临界值比较大小,不断更新临界值直到找到为止,给定的集合一定是有序的. 自己写的代码: 1 package com.gh; 2 3 import java.util.Arrays; 4 /** 5 * 二分查找算法实现 6 * @author ganhang 7 * 8 */ 9 public class Search { 10 public static void mai