二分查找c++实现

二分查找的算法原理较为简单,在此给出c++代码实现,以及代码中遇到的问题,以及解决方案:

 1 # include "iostream"
 2 using namespace std;
 3 
 4 //template <class, T>
 5 int Binary_search( const int vector[] , int value)//采用泛型的方式
 6 {
 7     //T* low = vector[0];
 8     //T* high = sizeof(vetor) / sizeof(vetor)+vector[0]-1;
 9     int low = 0;//获取最低位
10     int high = sizeof(vector) / sizeof(vector[0])-1;//这里显示的vector
11     cout << "vector:" << sizeof(vector) << endl;//这里sizeof vector等于=4,并不是4*13等于32???思考这是为什么
12     cout<<";vector[0]:" << sizeof(vector[0]) << endl;
13     cout << "high:" << high << endl;
14     //T *middle = (low + high) / 2;
15     int middle;
16     while (low <= high)
17     {
18         middle = (low + high) / 2;
19         if (vector[middle] > value)
20         {
21             high = middle - 1;
22         }
23         if (vector[middle] < value)
24         {
25             low = middle + 1;
26         }
27         if (vector[middle] == value)
28         {
29             return middle;
30         }
31     }
32 }
33 int main()
34 {
35     const int a[] = { 1, 2, 5, 8, 13, 19, 25, 38, 40, 47, 69, 48, 90 };
36     cout <<"a:" <<sizeof(a) << endl;
37     cout<<Binary_search(a, 5)<<endl;
38     system("pause");
39     return 0;
40 }

其中,while(){}代码段实现了二分查找的原理,但程序的运行结果并不正确。

我们知道通过 :sizeof(a)/sizeof(a[0])可以得到数组a的长度,但是经过参数传递,我们以为sizeof(vector)/sizeof(vector[0]) == sizeof(a)/sizeof(a[0])!!!但实际上,这是错误的!!!。数组不等于指针!!!。数组a传递给 vector,我们以为的是:将数组a的内容复制到数组vector,但实际的处理过程是:vector仅仅是一个指针,指向了数组a这块区域,但我们并不能通过这个指针vector来获得这块区域的大小。而sizeof(vector)也就成了我们得到的是指针变量的大小!!!,而不是指针所指向区域的大小!!!!。这是很重要的区别。

但是二分查找明显要求我们得到查找数据的长度。那么我们该如何得到这个长度呢?

一种方法是我们在主程序中先得到数据的长度,将长度作为一个函数参数进行传递。但这种方式真的很蠢(个人觉得真的很蠢!!!,因为这样不能体现算法本身的封装性)。那么有没有其他方法呢?

如果我们采用泛型加引用的方式呢?

 1 # include "iostream"
 2 using namespace std;
 3 
 4 template <class T>
 5 int Binary_search( const T & vector ,const  T value)//采用泛型的方式
 6 {
 7     int low = 0;
 8     int high = sizeof(vector) / sizeof(vector[0])-1;
 9     cout << "high:" << high << endl;
10     int middle;
11     while (low <= high)
12     {
13         middle = (low + high) / 2;
14         if (vector[middle] > value)
15         {
16             high = middle - 1;
17         }
18         if (vector[middle] < value)
19         {
20             low = middle + 1;
21         }
22         if (vector[middle] == value)
23         {
24             return middle;
25         }
26     }
27     
28 }
29 int main()
30 {
31     const int a[] = { 1, 2, 5, 8, 13, 19, 25, 38, 40, 47, 69, 48, 90 };
32     cout <<"a:" <<sizeof(a) << endl;
33     //const int value = 5;
34     cout<<Binary_search(a,5)<<endl;//无法执行
35     system("pause");
36     return 0;
37 }

我们的本意是:忽略传递数组的类型,采用泛型的思想设计程序,但是程序报错:

错误 1 error C2782: “int Binary_search(const T &,const T)”: 模板 参数“T”不明确 c:\users\kb409\desktop\c++\binary search\binary search\binary search.cpp 34 1 Binary search

由于泛型编程掌握的并不是很好,所以并不知道这样做错在哪里,如果有大神知道,请给我留言!

最后,将代码改成了下面这个样子,程序通过:

 1 # include "iostream"
 2 using namespace std;
 3 
 4 template <class T>
 5 int Binary_search( const T & vector ,const  int value)//采用泛型的方式
 6 {
 7     int low = 0;
 8     int high = sizeof(vector) / sizeof(vector[0])-1;
 9     cout << "high:" << high << endl;
10     int middle;
11     while (low <= high)
12     {
13         middle = (low + high) / 2;
14         if (vector[middle] > value)
15         {
16             high = middle - 1;
17         }
18         if (vector[middle] < value)
19         {
20             low = middle + 1;
21         }
22         if (vector[middle] == value)
23         {
24             return middle;
25         }
26     }
27     
28 }
29 int main()
30 {
31     const int a[] = { 1, 2, 5, 8, 13, 19, 25, 38, 40, 47, 69, 48, 90 };
32     //cout <<"a:" <<sizeof(a) << endl;
33     //const int value = 5;
34     cout<<Binary_search(a,90)<<endl;//可以执行
35     system("pause");
36     return 0;
37 }

所做的改变仅仅是将第五行const T value改变成了 int value ,鉴于目前知识水平有限吗,对模板的使用并不是很熟练,在后续中逐渐弄明白这个问题

 

posted @ 2019-02-22 09:18  少年π  阅读(4407)  评论(0编辑  收藏  举报