`

折半查找算法

阅读更多

在计算机科学中,折半搜索,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。 复杂度分析 时间复杂度折半搜索每次把搜索区域减少一半,时间复杂度为。(n代表集合中元素的个数)空间复杂度 。虽以递归形式定义,但是尾递归,可改写为循环。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#include<stdbool.h>


#define COMPARE(x,y) (((x) < (y)) ? -1 : ((x) == (y)) ? 0 : 1)

/*
int COMPARE(int x, int y)
{
    if(x < y) {
        return -1;
    } else if(x == y) {
        return 0;
    } else {
        return 1;
    }
}
*/


/* 非递归代码 */
int binsearch(int list[], int searchchnumm, int left, int right)
{
    int middle;
    while(left <= right) {
        middle = (right + left)/2;
        switch(COMPARE(list[middle], searchchnumm)) {
            case -1:
                left = middle + 1;
                break;
            case 0:
                return middle;
                break;
            case 1:
                right = middle -1;
                break;
            default:
                break;
            }
        }
        return -1;
}



/* 递归代码 */
int binsearch(int list[], int searchchnumm, int left, int right)
{
    int middle;
    if(left <= right) {
        middle = (left + right)/2;
        switch(COMPARE(list[middle], searchchnumm)) {
        case -1:
            return binsearch(list, searchchnumm, middle + 1, right);
            break;
        case 0:
            return middle;
            break;
        case 1:
            return binsearch(list, searchchnumm, left, middle - 1);
            break;
        default:
            break;
        }
    }
    return -1;
}

int main()
{
    int list[] = {2,4,5,1,-3,6,8,10,55,23};
    int searchnum = 5;
    int length;
    length = sizeof(list) / sizeof(int);
    printf("%d\n",length);
    printf("%d\n",binsearch(list,searchnum,0,length));
    return 0;    
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics