關鍵:數組中的元素必須是已經排好序的。
一維數組,二分法查找:
假如有一組數為1,2,3,4, 5 ,6,7, 8, 9, 10要查給定的值7.可設三個變量low,mid,high分別指向數據的前,中間和後,mid=(low+high)/2.
思路:
1:將low=0,值為1;high=9,值為10(因為數組下標從0開始);mid=(low+high)/2,即等於4,值為32(因為整型會省略小數點);
2:將mid的值與查找的數作比較,如果mid<n(這裡假設要查找的數為n),說明n在mid的後邊,則使得low=mid+1,high不變;如果n<mid,說明n在mid的前邊,則使得high=mid-1,low不變;如果mid==n,你懂的...
3:現在的mid等於4,值為5,查找的范圍為:5,6,7,8,9,10,顯然mid<n,此時mid執行2次循環便等於7,然後輸出mid.
例如: 設計一個程序,提供用戶輸入10個整數並保存到數組中,將整數以從大到小的順序排列,最後通過半分法查找用戶輸入的值並顯示值的序號.(VC++6.0環境)
代碼清單:
/******************************************************** ************************半分法查找*********************** ********************************************************/ #define M 10 #include <stdio.h> int main (void) { int a[M]; int n, low, mid, high, number; /*變量n是讓用戶輸入,變量low表示數組中的前位,mid表示數組中的中間位, high表示數組中的後位,number用於表示查找是否成功*/ int i, j, t; //變量i,j用於對數組元素進行從大到小排序;變量t用於數組元素值的交換 low = 0; high = M-1; number = 0; printf("Please input 10 numbers:\n"); for (n=0; n < 10; n++) //使用循環讓用戶為數組元素賦值 { printf("a[%d]=", n); scanf("%d", &a[n]); } for (i=0; i < M-1; i++)//使用冒泡排序法進行從大到小的排序 { for (j=0; j < M-1-i; j++) { if (a[j] < a[j+1]) //a[j+1]代表數組元素的後一個元素 { t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } } for (i=0; i < 10; i++) { printf("%d\t", a[i]); //輸出排序後的數組元素 } n = 0; printf("Please input a integer:\n"); //提示用戶輸入要查找的值 scanf("%d", &n); //使用二分法進行查找 while (low <= high) { mid = (low+high)/2; if (n == a[mid]) { number = 1; break; } else if (a[mid] < n) { high = mid-1; } else { low = mid+1; } } if (number == 1) { printf("the index of %d is: %d\n", n, mid); } else { printf("Program Can't find the number!\n"); }
總結:折半查找算法是通過中間值(mid)與要查找的值(n)作比較,每一次比較都可以縮小其的查找范圍;
優點:比較次數少,查找速度快,平均性能好;
缺點:要求待查表為有序表,且插入刪除困難。