天天看點

算法篇——二分查找

算法篇——二分查找

二分查找也稱折半查找,顧名思義,把一數組不斷地折半來查找。

1.條件:有序,有序,有序(重要的事情說三遍)

2.思路:查找元素的值與中間元素的值不斷比較,來標明區間,生成新的數組。

如:在a[]={1,2,3,4,5,6,7,8,9,10}中找到“6”。

第一次折半:取得數組a[]中間值“5”(不整除将向下取整) (找中值),“5”<“6”(比較),是以選擇後半部份元素 (選區間) ,産生新數組為a1[]={6,7,8,9,10} (新數組)。

第二次折半:取得數組a1[]中間值“8” (找中值),“8”>“6”(比較),是以選擇前半部份元素 (選區間),産生新數組為a2[]={6,7} (新數組)。

第三次折半:取得數組a2[]中間值“6”,即為所查找元素。

類似于猜數字遊戲,(1)1-100(25為謎底),先猜50,比較可知,猜大了,要往小一點的數字猜,把1-49再折一半,得25。(2)1-100(75為謎底),先猜50,比較可知,猜小了,要往大一點的數字猜,把51-100再折一半,得75。

3.優點:加快查找效率(剛開始我也不覺得效率有多快,可面對上萬元素時,一次折半就可以過濾掉一半元素,才覺得這方法運用起來還是不賴的)。

4.查找次數

算法篇——二分查找

5.代碼示範

#include<stdio.h>

void search(int a[], int n, int key)
{
	int low = 0; //數組第一個位置
 	int high = n - 1; //數組最後一個元素
 	int mid; //中間值
 	int counter = 0; //查找次數
	while(low <= high)
	{
  		counter++; //累加次數
  		mid = (low + high) / 2; //如果(low+high)不是偶數,mid将向下取整
  		if(a[mid] <= key)//選擇後區間為新區間
  		{
   			low = mid + 1; //把中間元素後面的一個元素當新區間的首元素
 		}
  		if(a[mid] >= key) //選擇前區間為新區間
  		{
   			high = mid - 1; //把中間元素前面的一個元素當新區間的尾元素
  		}
  		if (a[mid] == key)//找到該元素
  		{
   			printf("該值位置為:%d\n", mid + 1);
  		}
 	}
 	printf("查找次數為:%d\n", counter);
}
int main()
{
 	int a[] = {1,2,3,4,5,6,7,8,9,10};
 	int n = (sizeof(a) / sizeof(int));
 	int key = 6;
 	search(a,n,key);
 	return 0; 
} 
           
算法篇——二分查找

繼續閱讀