二分搜素查詢某個值
阿新 • • 發佈:2019-01-08
/* 設 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; }