高效查找方式——二分查找(拆半查找算法)

原理:

首先,二分查找針對的是已經排好序的數組,如果給出的數組是無序的,則需要先將數組進行排序。
每次都通過跟區間的中間元素對比,將待查找的區間縮小爲之前的一半,直到找到要查找的元素,或者區間被縮小爲 0。
如果查找值比中間位置的元素小,則從數組的左邊繼續查找,如果查找值比中間位置的元素大,則從數組的右邊繼續查找。
二分查找又稱折半查找,優點是比較次數少,查找速度快,平均性能好;其缺點是要求待查表爲有序表,且插入刪除困難。因此,折半查找方法適用於不經常變動而查找頻繁的有序列表。首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,否則進一步查找後一子表。重複以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在爲止,此時查找不成功。

在這裏插入圖片描述

#include "stdio.h"
int search (int *p , int length , int n);
int main()
{
		//二分查找,一定是在已經排好序的數組中進行查找
		int a[] = {1,2,5,8,23,56,89,123} ;
		int *p = a ;
		int length = sizeof(a)/sizeof(int) ; 
		int n , t ;
		printf(" 請輸入你要查找的數:") ;
		scanf("%d",&n) ; 
		t=search(p , length , n) ;
		if( t == -1 ){
			printf("沒查找到該數!!!\n");
		}else
			printf("%d的下標爲:%d\n",n,t); 
} 
int search (int *p , int length , int n){
		int temp , low , high ;
		low = 0;
		high = length - 1 ;
		while (low <= high) {
			temp = (low + high)/2 ;
			if(p[temp] == n) //查找到所需查找的數
		 		return temp ;
			 else if(p[temp] < n)
			 	low = temp + 1 ;
			 else
			 	high = temp - 1 ; 
		}
		return -1 ; //查找不到 
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章