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

简介: /* * 编写一个函数,对一个已排序的整数表执行二分查找。 * 函数的输入包括各异指向表头的指针,表中的元素个数,以及待查找的数值。 * 函数的输出时一个指向满足查找要求的元素的指针,当未查找到要求的数值时,输出一个NULL指针 * 用两个版本实现,一个用的是数组小标,第二个用的是指针 * 他们均采用了不对称边界 * Copyright (c) 2012 LiMingA
复制代码
/*
 * 编写一个函数,对一个已排序的整数表执行二分查找。
 * 函数的输入包括各异指向表头的指针,表中的元素个数,以及待查找的数值。
 * 函数的输出时一个指向满足查找要求的元素的指针,当未查找到要求的数值时,输出一个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;
}
复制代码
目录
相关文章
|
13天前
|
存储 C语言
C语言 — 指针进阶篇(下)
C语言 — 指针进阶篇(下)
20 0
|
13天前
|
存储 C语言 C++
C语言 — 指针进阶篇(上)
C语言 — 指针进阶篇(上)
26 0
|
19天前
|
存储 程序员 C语言
C语言指针的概念、语法和实现
在C语言中,指针是其最重要的概念之一。 本文将介绍C语言指针的概念、语法和实现,以及如何使用它们来编写高效的代码。
13 0
|
19天前
|
存储 C语言
【C语言】深入解开指针(三)2
【C语言】深入解开指针(三)
|
19天前
|
存储 程序员 C语言
【C语言】深入解开指针(二)2
【C语言】深入解开指针(二)
【C语言】深入解开指针(二)2
|
20天前
|
存储 C语言
【C语言】深入解开指针(一)1
【C语言】深入解开指针(一)
|
20天前
|
编译器 程序员 C语言
【C语言】变长数组,二分查找和数组之间自动替换的实现
【C语言】变长数组,二分查找和数组之间自动替换的实现
|
20天前
|
存储 C语言
【C语言数组】创建、初始化、以及使用2
【C语言数组】创建、初始化、以及使用
|
21天前
|
C语言 索引
基于C语言的函数指针应用-消息命令处理框架
基于C语言的函数指针应用-消息命令处理框架
11 0
|
26天前
|
算法 C语言
C语言之二分查找
C语言之二分查找