二分查詢(函式實現)

一隻菜雞罷遼發表於2020-10-31

二分查詢函式

程式碼目的

在一個整形有序陣列中查詢某一個數
找到則列印數字所在下標 , 否則列印未找到.

程式碼思想:

一個有序陣列數字都是遞增向上的 , 所以如果要查詢一個數 , 逐個遍歷雖然也可以找到 , 但效率很低.
所以我們從一箇中間數查起 , 將中間數與待查詢的數字比較 ,如果待查詢數比中間數大說明待查詢數在中間數的右邊 ,左邊就可以被排除掉 . 多次迴圈下來就能找到該數字. 這樣可以加快查詢速度, 提高效率.

程式碼示例:

//二分查詢(函式實現)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int BinarySearch(int arr[], int len, int toFind) {
	int left = 0;//自定義子區間左值 即待查詢區間最左端 
	int right = len - 1;//自定義待查詢區間右值(注意最右端下標為陣列長度減一)

	while (left <= right) {
		int mid = (left + right) / 2;//定義中間值mid
		if (toFind < arr[mid]) {//若中間值比待尋找的值大 證明待尋找的值在左側 則排除右側區間
			right = mid - 1;//待查詢區間右端變為mid-1
		}
		else if (toFind > arr[mid]) {//若中間值比待尋找的值小 證明待尋找的值在右側 則排除左側區間
			left = mid + 1;//待查詢區間左端變為mid+1
		}
		else {//若中間值與待尋找的值相比既不大也不小 則證明中間值就是待尋找的值
			printf("找到了!\n%d的下標為 %d\n", toFind, mid);//列印下標
			break;//找到了則跳出迴圈
		}
	}
	if (left > right) {//若區間左端大於右端則說明待尋找的值不在該陣列內
		printf("未找到! \n");
	}

}

int main() {
	int arr[] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, };//隨便定義一個有序陣列;
	int toFind;//定義待尋找的值
	printf("please enter what data you want to find:\n");
	scanf("%d", &toFind);//使用者輸入待尋找的數字
	int size = sizeof(arr) / sizeof(arr[0]);//計算陣列長度
	//因為陣列作為引數會被轉換成指標,進入函式內在計算長度等於在計算指標的長度,不符合題意
	//所以我們可以在主函式內求出長度繼而傳近函式使用
	BinarySearch(arr, size, toFind);//呼叫二分查詢函式

	system("pause");
	return 0;
}

結果演示

在這裡插入圖片描述

相關文章