数据结构与算法 ——二分查找

二分查找

一、概念

基础概念:二分查找又称折半查找,它是一种效率较高的查找方法。
二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用数组作为表的存储结构。不妨设有序表是递增有序的。

通俗理解:每次首先找到数组的中间位置(middle),然后把待查找数(target)与middle进行比较。

  1. 如果查找数target > middle,则将查找范围缩小到middle的右边。(因为数组是递增有序的,而target又笔middle大,所以只可能在middle的右边)
  2. 如果查找数target < middle,则将查找范围缩小到middle的左边
  3. 重复1。2操作,直到找到该数,或者没有找到

二、代码及过程

/**
*
*插入排序
*Date: 2019/4/14
*
***/
#include <stdio.h>

// 插入排序
/**
*
*二分查找
*Date: 2019/4/21
*
***/
#include <stdio.h>

// 二分查找
int binarySearch(int *a, int n, int target){
	int left = 0;
	int right = n - 1;
	int middle;

	while(left <= right){
		middle = (left + right) / 2;

		if(a[middle] == target){
			return middle;
		}
		
		if(target > a[middle]){
			left = middle + 1;
		}

		if(target < a[middle]){
			right = middle - 1;
		}
	}
	
	return -1;
}

// 遍历数组
void show(int *a,int n){
	for(int i = 0; i < n; i++){
		printf("%5d",a[i]);
	}
}


void main(){
	int a[] = {-20,17,20,22,30,35,46,99};
	int n = sizeof(a) / sizeof(a[0]);	// 数组长度
	int target;
	int res;

	printf("原数组:\n");
	show(a,n);

	printf("\n\n请输入要查找的元素:");
	scanf("%d",&target);
	res = binarySearch(a,n,target);
	
	if(res != -1){
		printf("\n该元素在第%d个位置\n",res);
	}else{
		printf("\n查无次元素!\n");
	}
	printf("\n");
}

三、复杂度

平均时间复杂度:O(logn)
空间复杂度: O(1)

猜你喜欢

转载自blog.csdn.net/weixin_43725997/article/details/89431702