问题:如何在一个严格递增序列A中找出给定的数x。
直接的办法:线性扫描——复杂度:O(n)
二分查找:——Olog(n)
1 /* 2 2020年3月24日12:23:35 3 算法设计作业 第一题 4 */ 5 6 /*题目: 7 给定有序数组A以及一个元素x,设计一个寻找x的分治算法并分析其时间复杂度, 8 要求返回x在数组中的位置。 9 */ 10 11 //严格有序序列找给定的数——二分查找 12 13 #include<iostream> 14 using namespace std; 15 const int maxn = 101; 16 17 int judge_incre(int x[],int num) //判断数组是否递增 18 { 19 int minx = x[0]; 20 int flag = 1; 21 for(int j = 1;j < num;j++) 22 { 23 if(x[j] < minx) 24 { 25 flag = 0; 26 break; 27 } 28 else 29 { 30 minx = x[j]; 31 } 32 } 33 if(flag == 0) 34 return 0; 35 else 36 return 1; 37 } 38 39 //二分区间为左闭右闭的[left,right],传入的初值为[0,n-1],x为欲查询的数 40 int binarySearch(int A[],int left,int right,int x) 41 { 42 int mid; //mid为left和right的中间点 43 while(left <= right) 44 { 45 mid = (left + right) / 2; 46 if(A[mid] == x) 47 { 48 return mid; //找到x,返回下标 49 } 50 else if(A[mid] > x) //中间数大于x 51 { 52 right =mid - 1; //往子区间[left,mid-1]查找 53 } 54 else //中间数小于x 55 { 56 left = mid + 1; //往子区间[mid+1,right]查找 57 } 58 } 59 return -1; //查找失败 60 } 61 62 int main() 63 { 64 int a[maxn]; 65 //数组a为严格递增序列 66 int n; //数组元素个数 67 cout << "请输入数组a的元素个数:n = "; 68 cin >> n; 69 cout << "请输入递增序列:"; 70 for(int i = 0;i < n;i++) 71 { 72 cin >> a[i]; 73 } 74 if(judge_incre(a,n)) 75 { 76 int x; 77 cout << "请输入要查找的数:x = "; 78 cin >> x; 79 80 if(binarySearch(a,0,n-1,x) != -1) 81 { 82 cout << x << "的下标为:" << binarySearch(a,0,n-1,x) << endl; 83 } 84 else 85 { 86 cout << "抱歉!查无此数!" << endl; 87 } 88 } 89 else 90 cout << "输入数组不正确!请重新输入!" << endl; 91 92 return 0; 93 }
注意:
如果二分上界超过int型数据的一半,那么当欲查询元素在序列靠后的位置时,语句mid=(left+right)/2中的left+right就有可能超过int型而导致溢出;此时应使用mid=left+(right-left)/2