二分法查詢有序陣列
阿新 • • 發佈:2018-11-10
當陣列為有序陣列,我們發現原始的方法在陣列中查詢一個數時,會通過多次執行迴圈查詢,然而這樣查詢下去,假設陣列中有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; }