1. 程式人生 > >二分法查詢有序陣列

二分法查詢有序陣列

     當陣列為有序陣列,我們發現原始的方法在陣列中查詢一個數時,會通過多次執行迴圈查詢,然而這樣查詢下去,假設陣列中有n個元素,最差的情況下會迴圈n次,當陣列中元素足夠大時,我們發現這樣查詢效率十分低下,那麼這裡使用二分法查詢會很大地提高查詢效率,這裡給出二分法分析步驟:

當有一個數組 arr[10] = {1,2,3,4,5,6,7,8,9,10};  假設尋找 key = 7;

1. left = 0; right = 9;查詢範圍下標:0~9    算出中間下標 mid = 4;

    將中間下標4對應的數字5與要尋找的數字7比較,5<7,將中間下標+1 賦給left,即 left=mid +1 = 5

2. left = 5;right = 9;查詢範圍下標:5~9     算出中間下標 mid = 7;

    將中間下標7對應的數字8與要尋找的數字7比較,8>7,將中間下標-1 賦給right,即 right=mid -1 = 8

3. left = 5;right = 8;查詢範圍下標:5~8     算出中間下標 mid = 6;

    將中間下標6對應的數字7與要尋找的數字7比較,7=7,找到了7,查詢結束。

 

這裡附上程式碼和結果:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>


int binary_search(char *arr, int key, int left, int right)
{
	int mid = 0;

	while (left <= right)
	{
		mid = left + (right - left) / 2;
		if (arr[mid] < key)
		{
			left = mid + 1;
		}

		else if(arr[mid] > key)
		{
			right = mid - 1;
		}

		else
		{
			return mid;
		}

	}

	return -1;
}


int main()
{
	int ret = 0;
	char arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]) - 1;

	int key = 0;
	printf("請輸入你要查詢的數:>");
	scanf("%d", &key);

	ret = binary_search(arr, key, left, right);//二分查詢

	if (-1 == ret)
	{
		printf("沒找到\n");
	}
	else
	{
		printf("找到了\n下標是%d", ret);
	}

	system("pause");
	return 0;
}