美文网首页
【算法学习】C 二分查找 - while 循环实现

【算法学习】C 二分查找 - while 循环实现

作者: Jiubao | 来源:发表于2017-01-18 11:36 被阅读63次

通过 while 循环的方式,简单实现 C 语言的二分查找。

#include <stdio.h>

int binarySearch(int a[], int count, int key)
{
    int low = 0;
    int high = count-1;

    while (low <= high) {
        int mid = (low + high) / 2;
        
        printf("low is %d, high is %d, mid is %d, a[mid] is %d, key is %d \n", low, high, mid, a[mid], key);

        if (a[mid] == key) {
            printf("- match -\n");

            return mid;
        } else if (a[mid] > key) {
            printf("<- try\n");
            
            high = mid - 1;
        } else {
            printf("try ->\n");

            low = mid + 1;
        }
    }

    return -1;
}

int main() {
    int array[] = {1, 2, 3, 4, 5, 6, 7, 8}; 
    
    printf("Input the key you want to search: \n");
    
    int key;
    scanf("%d", &key);

    int location = binarySearch(array, 8, key);

    if (location >= 0) {
        printf("Find successed. location is %d and find key is %d\n", location, array[location]);   
    } else {
        printf("Find failed.\n");
    }

    return 0;
}

运行验证如下:

  • key 在左侧
➜  C ./a.out
Input the key you want to search: 
1
low is 0, high is 7, mid is 3, a[mid] is 4, key is 1 
<- try
low is 0, high is 2, mid is 1, a[mid] is 2, key is 1 
<- try
low is 0, high is 0, mid is 0, a[mid] is 1, key is 1 
- match -
Find successed. location is 0 and find key is 1
  • key 超出左侧
➜  C ./a.out
Input the key you want to search: 
0
low is 0, high is 7, mid is 3, a[mid] is 4, key is 0 
<- try
low is 0, high is 2, mid is 1, a[mid] is 2, key is 0 
<- try
low is 0, high is 0, mid is 0, a[mid] is 1, key is 0 
<- try
Find failed.
  • key 在右侧
➜  C ./a.out
Input the key you want to search: 
8
low is 0, high is 7, mid is 3, a[mid] is 4, key is 8 
try ->
low is 4, high is 7, mid is 5, a[mid] is 6, key is 8 
try ->
low is 6, high is 7, mid is 6, a[mid] is 7, key is 8 
try ->
low is 7, high is 7, mid is 7, a[mid] is 8, key is 8 
- match -
Find successed. location is 7 and find key is 8
  • key 超出右侧
➜  C ./a.out
Input the key you want to search: 
9
low is 0, high is 7, mid is 3, a[mid] is 4, key is 9 
try ->
low is 4, high is 7, mid is 5, a[mid] is 6, key is 9 
try ->
low is 6, high is 7, mid is 6, a[mid] is 7, key is 9 
try ->
low is 7, high is 7, mid is 7, a[mid] is 8, key is 9 
try ->
Find failed.

总结

主要需要考虑 mid 在 while 循环中的修改,对于边界的情形,需要谨慎处理。

我在写的过程中,主要在以下三处出现过问题:

  • 这里需要注意,low 与 high 遇到的时候,就是数组结束的时候。
while (low <= high) {...}
  • 当找到的值比 key 大,这时候 key 在数组左侧,所以把 high 调整为 mid 的左侧一个,因为 mid 已经校验过,所以需要减一。
high = mid - 1;
  • 当找到的值比 key 小,这时候 key 在数组右侧,所以把 low 调整为 mid 的右侧一个,因为 mid 已经校验过,所以需要加一。
low = mid + 1;

相关文章

  • 【算法学习】C 二分查找 - while 循环实现

    通过 while 循环的方式,简单实现 C 语言的二分查找。 运行验证如下: key 在左侧 key 超出左侧 k...

  • 算法之二分查找

    二分查找 二分查找是著名、高效并有应用广泛的查找算法。 二分常规实现 1.循环实现 下面我用python语言实现循...

  • 简单算法

    冒泡排序: while 实现的二分查找: 递归实现二分查找:

  • 查找算法之-二分查找

    查找是针对已排序数进行查找的。1、二分查找非递归实现思想:通过while循环不断在新的区间中二分查找 2、二分查找...

  • 算法之二分查找

    排序算法 二分查找 用于有序元素列表的查找性能: Python实现: C#实现

  • 排序方式

    冒泡排序: 选择排序: 二分查找: 1.递归的方式: 2.while循环实现: 3.测试代码:

  • c语言第六讲 循环语句

    目标: while循环语句 for循环语句 do……while循环语句 循环语句的效率 折半查找算法介绍以及应用场...

  • 分治算法(swift二分法排序递归实现)

    二分查找 1、二分查找(Binary Search) 2、二分查找的基本思想 swift算法实现

  • 数据结构与算法系列——二分查找

    二分查找算法的简单介绍 今天我们来学习一下二分查找算法,也叫做折半查找算法。使用二分查找算法的前提是数据需要是有序...

  • 二叉树的插入和搜索--python实现

    本文首先介绍了二分查找法,采用“循环”和“递归”2种方法实现。采用递归算法实现了二叉树的插入和搜索算法。 一、二分...

网友评论

      本文标题:【算法学习】C 二分查找 - while 循环实现

      本文链接:https://www.haomeiwen.com/subject/zcnvbttx.html