[关闭]
@CrazyHenry 2018-03-06T17:21:38.000000Z 字数 1646 阅读 978

0.x 12.二分查找法

dddd数据结构课本


非递归

  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <iterator>
  5. #include <algorithm>
  6. #include <typeinfo>
  7. #include <numeric>
  8. #include <memory>
  9. #include <stdexcept>
  10. #include <fstream>
  11. #include <cmath>
  12. #include <ctime>
  13. #include <utility>
  14. #include <sstream>
  15. #include <random>
  16. #include <cassert>
  17. using namespace std;
  18. template<typename T>
  19. int binarySearch(T arr[], int n, T target){
  20. // 在arr[l...r)之中查找target,使用C++11标准的左闭右开
  21. int l = 0, r = n;
  22. while( l != r ){ //l==r时,表示没有元素
  23. //int mid = (l + r)/2;
  24. // 防止极端情况下的整形溢出,使用下面的逻辑求出mid
  25. int mid = l + (r-l)/2;
  26. if( arr[mid] == target )
  27. return mid;
  28. if( arr[mid] > target )
  29. r = mid;
  30. else
  31. l = mid + 1;
  32. }
  33. return -1;
  34. }
  35. int main() {
  36. int n = 1000000;
  37. int* a = new int[n];
  38. for( int i = 0 ; i < n ; i ++ )
  39. a[i] = i;
  40. cout<<binarySearch(a,n,60000)<<endl;
  41. return 0;
  42. }

递归

  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <iterator>
  5. #include <algorithm>
  6. #include <typeinfo>
  7. #include <numeric>
  8. #include <memory>
  9. #include <stdexcept>
  10. #include <fstream>
  11. #include <queue>
  12. #include <cmath>
  13. #include <ctime>
  14. #include <utility>
  15. #include <sstream>
  16. #include <random>
  17. #include <cassert>
  18. using namespace std;
  19. // 用递归的方式写二分查找法
  20. template<typename T>
  21. int __binarySearch2(T arr[], int l, int r, T target){
  22. if( l == r )
  23. return -1;
  24. //int mid = (l+r)/2;
  25. // 防止极端情况下的整形溢出,使用下面的逻辑求出mid
  26. int mid = l + (r-l)/2;
  27. if( arr[mid] == target )
  28. return mid;
  29. else if( arr[mid] > target )
  30. return __binarySearch2(arr, l, mid, target);
  31. else
  32. return __binarySearch2(arr, mid+1, r, target);
  33. }
  34. template<typename T>
  35. int binarySearch2(T arr[], int n, T target){
  36. return __binarySearch2( arr , 0 , n, target);
  37. }
  38. int main()
  39. {
  40. int a[] = {1,2,3,4,5,6,7,8,9,10};
  41. int result = binarySearch2(a,10,6);
  42. cout<< result<<endl;
  43. return 0;
  44. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注