C語言程序設計:二分查找(折半查找)


C語言程序設計:二分查找(折半查找)

1.什么是二分查找

二班查找又稱折半查找,他是一種高效率的查詢方法。

2.二分查找的優點

高效,減少查詢次數,查找的速度快,平均性能好(貌似 快速排序 也是),非遞歸實現(我覺得也是優點吧)。

3.二分查找的缺點

1)必須采用順序存儲結構。

2)必須按關鍵字大小有序排列。

說人話就是 數據得是數組,且從大到小 或者 從小到大 等進行排好序。

4.二分查找原理

1

針對已經排列好的數組,假如我判斷6是否在這個數組內,如果是返回ture,否則返回false。

我們在數組的最左邊定義一個left,在最右邊定義為right,中間的mid則為(left+right)/2

我們用mid的值與6做對比,發現mid的值為5,6比5大,則mid左邊的所有數據都拋棄掉,同時,我們把left的值設為mid+1,right保持不變

NueXini2

則left則到了6這個位置,則mid可以是7或者8這個位置,不影響操作。假設mid在的7位置

我們這時在比較6與mid的值比較,發現mid的值為7,6比7小,則mid右邊的所有數據都拋棄掉,同時right變為mid-1

NueXini3.png

此時,我們的mid位置為(left+right)/2=6,mid的第6位置的值為6,是我們要查找的6,則 return true。


但是,假如我們查找的數不在這個數組里面呢?

首先,我們定義一串這樣的數組a,要查找的數為60

NueXini4

定義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不變

NueXini5

此時mid=(left+right)/2=(5+9)/2=7,a[mid]=a[7]=74

同理,60小於74,則right=mid-1=6,left不變

NueXini6

此時只剩下兩個值,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~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM