1. 程式人生 > >二分搜素查詢某個值

二分搜素查詢某個值

/*
	設 a[0:n-1]是已排好序的陣列,請改寫二分搜尋演算法,
	使得當搜尋元素 x 不在陣列中時,
	返回小於 x 的最大元素位置 i 和大於 x 的最小元素位置 j。
	當搜尋元素在陣列中時,i 和 j 相同, 均為 x 在陣列中的位置。
*/
#include<cstdio>
#include<algorithm>
using namespace std;
/*
定義查詢函式,三個變數依次為 陣列、陣列長度、待查詢元素 
*/
int Search(int b[], int b_length, int b_num)
{
	int b_detection = -1;		//待查詢元素的標誌位
	int b_right = b_length - 1; 	// 陣列的右邊界
	int b_middle = 0;  			//中間值的標誌位 
	int b_left = 0; 			//陣列的左邊界
	
	/*二分查詢*/
	while(b_left <= b_right)
	{
		b_middle = (b_left + b_right) / 2;
		if(b[b_middle] == b_num)		//找到了待查詢元素 
		{
			b_detection = b_middle;	//待查詢元素的標誌位等於b_middle的標誌位 
		}
		/*陣列元素有序
		待查詢元素小於中間值  往中間值的左邊查詢
		將中間值(包括中間值)右邊的資料捨去 
		即 -- 將陣列的右邊界 b_right更新為b_middle - 1 
		*/
		if(b[b_middle] > b_num)
		{
			b_right = b_middle - 1; 
		}
		else
		{
			b_left = b_middle + 1;
		}
	}
	int i = 0, j = 0;		//定義距離待查詢元素兩側最近的元素的標誌位 
	/*
	當待查詢元素不在陣列中
	返回小於 x 的最大元素位置 i 和大於 x 的最小元素位置 j
	*/
	if(b_detection == -1)	
	{
		i = b_right;
		j = b_left;
		printf("待查詢元素不在素組中!\n");
		printf("小於待查詢元素的最大元素位置 i = %d\n",i);
		printf("大於待查詢元素的最小元素位置 j = %d\n",j);
	}
	/*
	當待查詢元素在陣列中
	i 和 j 相同, 均為 x 在陣列中的位置
	*/
	else		
	{
		i = b_detection;
		j = b_detection;
		printf("待查詢元素在素組中\n");
		printf("待查詢元素在素組中的位置i = %d,j = %d\n",i,j);
	}
} 
int main()
{
	int a[] = {1,2,3,4,5,16,17,18,19,20} ;//定義一個數組並初始化 (題目中已說明陣列有序)
	int length = sizeof(a) / sizeof(int);//計算出陣列的長度 -- sizeof計算的是位元組長度 
	int search_num;		//定義需要查詢的元素
	printf("請輸入待查詢元素的值\n");
	scanf("%d",&search_num);
	Search(a,length,search_num);	//呼叫函式並傳引數 
	return 0;
}