C語言程序設計:二分查找(折半查找)
1.什么是二分查找
二班查找又稱折半查找,他是一種高效率的查詢方法。
2.二分查找的優點
高效,減少查詢次數,查找的速度快,平均性能好(貌似 快速排序 也是),非遞歸實現(我覺得也是優點吧)。
3.二分查找的缺點
1)必須采用順序存儲結構。
2)必須按關鍵字大小有序排列。
說人話就是 數據得是數組,且從大到小 或者 從小到大 等進行排好序。
4.二分查找原理
針對已經排列好的數組,假如我判斷6是否在這個數組內,如果是返回ture,否則返回false。
我們在數組的最左邊定義一個left,在最右邊定義為right,中間的mid則為(left+right)/2
我們用mid的值與6做對比,發現mid的值為5,6比5大,則mid左邊的所有數據都拋棄掉,同時,我們把left的值設為mid+1,right保持不變
則left則到了6這個位置,則mid可以是7或者8這個位置,不影響操作。假設mid在的7位置
我們這時在比較6與mid的值比較,發現mid的值為7,6比7小,則mid右邊的所有數據都拋棄掉,同時right變為mid-1
此時,我們的mid位置為(left+right)/2=6,mid的第6位置的值為6,是我們要查找的6,則 return true。
但是,假如我們查找的數不在這個數組里面呢?
首先,我們定義一串這樣的數組a,要查找的數為60
定義a起始位置為left,末尾位置為right,則mid=(0+9)/2=4(4或者5都可以),a[mid]=a[4]=45
60比a[mid]=45大,所以我們可以舍棄mid左邊所有的數據,同時,left=mid+1即left=5,right不變
此時mid=(left+right)/2=(5+9)/2=7,a[mid]=a[7]=74
同理,60小於74,則right=mid-1=6,left不變
此時只剩下兩個值,mid=(5+6)/2=5或6,mid等於哪個都沒問題,a[mid]=a[6]=67,我們要找的值是60,那我們繼續分析的話,則right=mid-1,那left=mid=right,假如我們要找的數是67,我們就找到了,返回true,可惜我們現在找的是60,在走下去,依舊得不到結果,這樣做就沒有意義了,所以要使它有意義就必須滿足left<=right,這便是我們進行二分查找的循環條件~~!
5.源代碼實現
#include<stdbool.h>
#include<stdio.h>
bool halfsort(int need_num, int num[], int num_length);
int main()
{
int a[] = { 11,18,22,34,45,53,67,74,89,99 };
int len = sizeof(a) / sizeof(a[0]);
for (int i = 0; i < len; i++)
{
printf("正在檢測[%d]:%d\n", a[i], halfsort(a[i], a, len));
}
}
bool halfsort(int need_num, int num[], int num_length)
{
bool ret = false;
int left = 0;
int right = num_length - 1;//計算出數組個數,數組中下標從0開始,需要-1
while (left <= right)
{
int mid = (left + right) / 2;
if (num[mid] == need_num) {
ret = true;
break;
}
else if ( need_num < num[mid]) {
right = mid - 1;
}
else {
left = mid + 1;
}
}
return ret;
}
6.后話
分析原理的時候,可能說的有點亂,大概就是那樣子,可以自己琢磨分析一下,enioy it~