二分查找
一、概念
基础概念:二分查找又称折半查找,它是一种效率较高的查找方法。
二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用数组作为表的存储结构。不妨设有序表是递增有序的。
通俗理解:每次首先找到数组的中间位置(middle),然后把待查找数(target)与middle进行比较。
- 如果查找数target > middle,则将查找范围缩小到middle的右边。(因为数组是递增有序的,而target又笔middle大,所以只可能在middle的右边)
- 如果查找数target < middle,则将查找范围缩小到middle的左边
- 重复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)