Binary Search--二分查找
采用二分法查找时,数据需是排好序的。 基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段 中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。
二分法查找在针对大量有序排列的情况下发挥出很优越的效率,其时间复杂度O(lgN)。
代码:
1 /* 2 Author:Mengmeng 3 Time:2016-6-27 23:33:49 4 Description: 5 采用二分法查找时,数据需是排好序的。 6 基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较, 7 如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段 中查找; 8 若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。 9 */ 10 #include <iostream> 11 using namespace std; 12 13 14 int BinarySearch(int data[],int min,int max,int dest,bool UpOrDown) 15 { 16 int mid = 0; 17 if (min > max)//递归结束条件 18 { 19 cout << "找不到" << dest << "!"<<endl; 20 return -1; 21 } 22 mid = (max + min) / 2; 23 if (dest == data[mid])//递归结束条件 24 return mid; 25 if (UpOrDown == true)//升序排列 26 { 27 if (dest < data[mid])//递归条件 28 return BinarySearch(data, min, mid - 1, dest, true); 29 else 30 return BinarySearch(data, mid + 1, max, dest, true); 31 } 32 else//降序排列 33 { 34 if (dest < data[mid]) 35 return BinarySearch(data, mid + 1, max, dest, false); 36 else 37 return BinarySearch(data, min, mid - 1, dest, false); 38 } 39 40 41 42 } 43 int main(void) 44 { 45 int data1[] = { 0, 11, 22,33,44,55,66,77,88,99 }; 46 int data2[] = { 99, 88, 77, 66, 55, 44, 33, 22, 11, 0 }; 47 #if 0 48 cout << "请参照下列数字:" << endl; 49 cout<< "{"; 50 int len = sizeof(data1) / sizeof(int); 51 for (int i = 0; i < len; i++) 52 cout << data1[i] << " "; 53 cout << "}" << endl; 54 cout << "输入你要查找的目标:" << endl; 55 int dest; 56 cin >> dest; 57 cout <<"----------------------------------------"<< endl; 58 int index = BinarySearch(data1, 0, len - 1, dest,true); 59 #endif 60 #if 1 61 cout << "请参照下列数字:" << endl; 62 cout << "{"; 63 int len = sizeof(data2) / sizeof(int); 64 for (int i = 0; i < len; i++) 65 cout << data2[i] << " "; 66 cout << "}" << endl; 67 cout << "输入你要查找的目标:" << endl; 68 int dest; 69 cin >> dest; 70 cout << "----------------------------------------" << endl; 71 int index = BinarySearch(data2, 0, len - 1, dest, false); 72 #endif 73 if (index!=-1) 74 cout << dest << "在数组中的位置为第" << index << "个" << endl; 75 return 0; 76 77 }
运行结果:
(1)升序的情况:
(2)降序的情况: