算法设计实验二

实验二 二分查找

问题描述

给定已按升序排好序的 n 个元素 a[0 : n-1] ,现要在这 n 个元素中找出一特定元素 x。
基本思想是:将 n 个元素分成大致相同的两半,取 a[n/2] 与 x 相比较:

  • 如果 a[n/2] == x,则找到,算法终止;
  • 如果 a[n/2] < x,则在数组的左半部继续搜索;
  • 如果 a[n/2] > x,则在数组的右半部继续搜索。

下图描述了寻找 x = 88 的过程:

search

参考实现

#include <stdio.h>
#include <stdlib.h>

// 在 a[start:end) 中查找 x
int search(int a[], int start, int end, int x) {
    // 递归出口:没有元素,返回 -1
    if (start >= end) return  -1;   

    // 中点位置
    int middle = start + (end - start) / 2;
    // 找到,返回索引
    if (x == a[middle])
        return middle;

    if (x < a[middle]) 
        // 在左边查找
        return search(a, start, middle, x);
    else 
        // 在右边查找
        return search(a, middle+1, end, x);
}

int main() {
    int a[] = {
          1,  3,  8, 12, 13, 15, 19, 22, 23, 40, 42, 51,
         59, 60, 62, 67, 88, 89, 90, 91, 94, 96, 98, 99
    };

    int N = 24;
    int x = 88;

    int index = search(a, 0, N, x);
    printf("found index = %d\n", index);

    return 0;
}

参考实现 2

使用 Javascript 语言实现,可在线运行。

function search(a, start, end, x) {
    if (start >= end) return  -1;

    var middle = Math.floor(start + (end - start) / 2);
    if (x == a[middle])
        return middle;

    if (x < a[middle]) 
        return search(a, start, middle, x);
    else 
        return search(a, middle+1, end, x);
}

function main() {
    var a = [
          1,  3,  8, 12, 13, 15, 19, 22, 23, 40, 42, 51,
         59, 60, 62, 67, 88, 89, 90, 91, 94, 96, 98, 99];

    var index = search(a, 0, a.length, x);
    println("Your input = ", x);
    println("found index = ", index);
}
x =

思考

在上图中,查找到 x (即 88 ) , 一共进行了多少次比较?
如果想要在程序中打印出比较的次数,应该怎样修改源程序?

posted on 2012-02-11 15:12  wuqq  阅读(191)  评论(0)    收藏  举报