1. 程式人生 > 實用技巧 >C語言成長之路48:二分查詢法

C語言成長之路48:二分查詢法

宣告:本筆記基於B站UP主「來自程式設計師的暴擊」的「C語言成長之路」中對應課程;

介紹:

  二分查詢也稱折半查詢(Binary Search),它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。

查詢過程:   首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。 注意事項:   1.必須採用順序儲存結構。   2.必須按關鍵字大小有序排列。 優與劣:   優點是比較次數少,bai查詢速度快,平均du效能好;   缺點是要bai求待查表為有序表,且插入刪除困難;

程式碼:
 1 void binarySearch(int a[],int aSize,int searchTarget){
 2     /*  二分查詢法  */
 3     /*  注:二分查詢必須傳入的是一個按照數字大小排序的陣列,否則無法正常查詢  */
 4     int firstNum = 0;
 5     int lastNum = (aSize / 4) - 1;
 6     int flag = 0;                                                               //  設定一個值,用來最後判定是否查找出需要找的數字
7 printf("Start to find targetNum %d\n",searchTarget); 8 while (firstNum <= lastNum){ // 迴圈條件 9 int mid = (firstNum + lastNum) / 2; // 由於二分查詢法是通過折半查詢,取陣列長度的一半進行判定,所以需要設定中位數,但這樣寫有溢位問題 10 printf("
mid = %d\n",mid) 11 if (searchTarget == a[mid]){ // 當目標數字和陣列的中位數相等,即找到目標,進行輸出 12 printf("Find the target [%d]\n",a[mid]); 13 flag = 1; // 更改flag的狀態 14 break; // 由於已經找到了目標,跳出迴圈 15 } else if (searchTarget > a[mid]){ // 由於目標大於中位數的值得 16 firstNum = mid + 1; // 重新定義下一次搜尋的範圍的最小值 17 printf("<fail, next step> firstNum --> %d\n",firstNum); 18 } else if (searchTarget < a[mid]) { // 由於目標小於中位數的值 19 lastNum = mid - 1; // 重新定義下一次搜尋範圍的最大值 20 printf("<fail, next step> lastNum --> %d\n",lastNum); 21 } 22 } 23 if (flag == 0){ // 當flag仍然為0時,嘖表示無法找到目標數字,輸出文字 24 printf("I can't find the targetNum(%d) from list a.",searchTarget); 25 } 26 } 27 28 29 void main(){ 30 int a[100] = {0}; // 定義一個有100個元素的陣列 31 for (int i = 0;i < 100;i++){ // 通過自增1的方式,填充陣列,由於是自增1的方式,所以是按照一定排列順序排列 32 a[i] = i; 33 } 34 int targetNum = 77; // 設定需要查詢的值 35 int aSize = sizeof(a); // 獲取陣列長度 36 binarySearch(a,aSize,targetNum); // 呼叫方法 37 };