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

原理:

首先,二分查找针对的是已经排好序的数组,如果给出的数组是无序的,则需要先将数组进行排序。
每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 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 ; //查找不到 
}

在这里插入图片描述

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