二分查找法:对一个有序序列进行一分为二的检索,每次查找范围缩小一半,直到找到所需的数或者查找范围不存在;
问题描述:对一个有序序列检索一个输入的数,若该数存在则返回下标,否则返回1;
问题分析:这种问题最简单的方法是顺序检索,在数据量小的情况下,顺序和二分还有二叉查找树没有很大差别(此时是单边树),但在数据量大的情况下,对有序表的检索二分较优。
这里用二叉查找树只是因为想复习一下数据结构学过的知识。
时间复杂度:log(n)
算法设计:
// // binary_search.cpp // // // Created by yizhihenpidehou on 2020/3/10. // #include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> using namespace std; const int maxen=500; int binary_search(int *num,int search_num,int len){ //二分查找法 int left=1; int right=len; int mid; while(left<=right){ mid=(left+right)/2; if(num[mid]==search_num){ return mid; } else if(num[mid]<search_num){ left=mid+1; } else{ right=mid-1; } } return 0; } int main(){ int n;//输入数的数量 scanf("%d",&n); int j=0; int num[maxen]; for(int i=1;i<=n;i++){ scanf("%d",&num[i]); } int search_num; scanf("%d",&search_num); j=binary_search(num,search_num,n); printf("%d ",j); return 0; }
2:二叉查找树(BST)
算法时间复杂度:在单支树的情况下是O(n),在分布均匀的情况下是O(logn)
算法设计
// // binary_search.cpp // // // Created by yizhihenpidehou on 2020/3/10. // #include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> using namespace std; const int maxen=500; int binary_search(int *num,int search_num,int len){ int left=1; int right=len; int mid; while(left<=right){ mid=(left+right)/2; if(num[mid]==search_num){ return mid; } else if(num[mid]<search_num){ left=mid+1; } else{ right=mid-1; } } return j; } int main(){ int n;//输入数的数量 scanf("%d",&n); int j=0; for(int i=1;i<=n;i++){ scanf("%d",&num[i]); } int search_num; scanf("%d",&search_num); j=binary_search(num,search_num,n); printf("%d ",j); return 0; }
github:https://github.com/yizhihenpidehou/bananas/tree/master/%E7%AC%AC%E4%B8%89%E5%91%A8