1. 程式人生 > >【二分查詢】用C語言實現一個有序陣列的二分查詢

【二分查詢】用C語言實現一個有序陣列的二分查詢

什麼是二分查詢?

首先,二分查詢也叫折半查詢,它是對於一組有序(升序或降序)數列來說的,我們舉例子說明這個思想。
例如:猜數字遊戲
隨機給出1-100內的一個數字,請猜出這個數字
那我們不能隨機沒有規律的去猜,這時考慮二分查詢的思想
例如38
第一次猜50,告訴你猜大了,那麼此時就在1-50內折半
第二次猜25,告訴你猜小了,那麼此時就在26-49內折半…以此類推
這就是二分查詢的思想。

那麼我們如何用c語言來編寫實現它呢?

給出一個升序陣列arr[10]={0,1,2,3,4,5,6,7,8,9},要求用二分查詢的方法找出4。
那麼第一次我們折半找到5,5>4
然後進行第二次折半找到2,2<4
進行第三次折半找到3,3<4
最後一次我們就找到了目標數字4

接下來我們用兩種方式實現:

1、(此程式碼存在安全問題並可以優化)

#include<stdio.h>
int binary_search(int arr[], int num, int sz)//二分查詢函式
{
    int mid = 0;//折半後數字的下標
    int left = 0;//左下標
    int right = sz - 1;//右下標
    while (left <= right)//判斷當左下標小於右下標條件滿足
    {
        mid = (left + right)/2;//找出折半後數字下標(儘量不要用此方法)
        if
(num <arr[mid]) right = mid; else if (num > arr[mid]) left = mid; else return mid;//找到目標數字並返回陣列下標 } return -1;//左下標大於右下標沒找到 } int main() { int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int num = 3; int sz = sizeof(arr) / sizeof(arr[0
]);//求這個陣列的大小 int tmp = binary_search(arr,num,sz); if (tmp != -1) printf("exist the number is:%d", tmp); else printf("no exist!"); return 0; }

2、這個程式碼更具體是程式碼一的優化 給出左右下標在這個範圍內查詢

#include<stdio.h>
int binary_search(int arr[], int left, int right, int  num)//二分查詢函式 給出做右下標在此範圍內找
{
    int mid = 0;
    while (left <= right)
    {
        mid = left + ((right - left) >> 1);//這樣求中間的數的下標等安全>>為右移符號,右移1等於除以2
        if (num <arr[mid])
            right = mid;
        else if (num > arr[mid])
            left = mid;
        else
            return mid;
    }
    return -1;
}

int main()
{
    int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int num = 3;
    int tmp = binary_search(arr, 0, 6, num);
    if (tmp!=-1)
        printf("exist the number is:%d", tmp);
    else
        printf("no exist!");
    return 0;
}