标签:分治法 二分法 stream info 技术 cout 存在 col lse
PTA算法 7-1 二分查找
1 #include <iostream> 2 using namespace std; 3 4 int number = 0; //定义比较次数 5 6 //left和right分别代表a[]最小值下标和最大值下标 7 void binarySearch(int a[], int x, int left, int right){ 8 //如果x不存在,输出-1 9 if(left > right){ 10 cout << "-1" << endl; 11 cout << number; 12 } 13 else{ 14 number++; //每次查找都是一次比较 15 int mid = (left + right) / 2; 16 //当二分查找的中间值就是要找的x,则输出下标和比较次数 17 if(a[mid] == x){ 18 cout << mid << endl; 19 cout << number; 20 } 21 //如果中间值大于x,则递归查找中间值左边的一半数组 22 else if(a[mid] > x){ 23 binarySearch(a, x, left, mid - 1); 24 } 25 //如果中间值小于x,则递归查找中间值右边的一半数组 26 else if(a[mid] < x){ 27 binarySearch(a, x, mid + 1, right); 28 } 29 } 30 } 31 32 int main(){ 33 int n, x; 34 int a[1000]; 35 cin >> n; 36 for(int i = 0; i < n; i++){ 37 cin >> a[i]; 38 } 39 cin >> x; 40 binarySearch(a, x, 0, n - 1); 41 return 0; 42 }
(1)时间复杂度:
每经过一次比较,数组a的大小就变为原来的一半,则有T(n) = O(1) + T(n/2) = O(logn)
(2)空间复杂度:
因为定义的变量a[]所分配的空间大小不随n和x的变化而变化,所以该算法的空间复杂度S(n) = O(1)
该题主要是要理解分治法的思想,二分法顾名思义就是讲一个大的问题分为两个较小的子问题进行求解,我这里用的是递归的算法,在将a[mid]和x进行比较后,要分清当x<a[mid]时应该在左边的子数组里进行递归查找,反过来则在右边的子数组里进行查找。还有就是x不存在的情况,就是当你二分查找完,left指向的下标已经超过了right指向的下标时,就可以返回-1了。
遇到的主要问题是开始没有想到number++放在哪里比较合适,没有想到每进行一次二分查找就是一次比较的情况。
标签:分治法 二分法 stream info 技术 cout 存在 col lse
原文地址:https://www.cnblogs.com/jewfer-03-08/p/11567543.html