用指针操作实现二分法程序
来源:互联网 发布:php框架有什么用 编辑:程序博客网 时间:2024/05/21 11:22
二分法一直在查找已排序数据中占有很重要的位置,我们经常使用的二分法是在数组中使用。如下
/* binsearch: find x in v[0] <= v[1] <= ... <= v[n−1] */int binsearch(int x, int v[], int n){int low, high, mid;low = 0;high = n − 1;while (low <= high) {mid = (low+high)/2;if (x < v[mid])high = mid + 1;else if (x > v[mid])low = mid + 1;else /* found match */return mid;}return −1; /* no match */}
但是有时候我们会使用指针操作数组中的元素,而不是使用数组下表,虽然两者具有千丝万缕的联系,这时候如果照搬上面程序是不能通过的,两个指针相加是违法的,这时候如果使用
mid = (low+high)/2; /*Wrong*/
编译器将会报错。然而两个指针相减则合法,表示两个指针之间的元素个数,注意是元素个数,而不是字节数。
因此我们可以这样运算
mid = low + (high-low)/2; /*right*/
下面是使用指针操作实现二分法运算。
/* binsearch: find word in v[0]...v[n−1] */int *binsearch(int x, int *v, int n){int* low = &v[0];int* high = &v[n];int* mid = NULL;while (low < high) {mid = low + (high−low) / 2;if (x < *mid))high = mid;else if (x > *mid)low = mid + 1;elsereturn mid;}return NULL;}
此处得到两端代码,我们可以研究一下两段代码的区别,首先就是关于high的初始化。第一段代码将high初始化为最后一个元素,第二段代码将high初始化为最后一个元素后面的一个元素。由于初始化的不同会对后面mid的赋值产生影响。我们可以发现代码中对边界真正的影响为图中红色部分,于是我们尝试修改代码时二者一致。于是下面的代码出现
/* binsearch: find word in v[0]...v[n−1] */int *binsearch(int x, int *v, int n){int* low = &v[0];int* high = &v[n-1];int* mid = NULL;while low <= high) {mid = low +(high - low)/ 2;if (x < *mid)high = mid-1;else if (x > *mid)low = mid + 1;elsereturn mid;}return NULL;}
- 用指针操作实现二分法程序
- 二分法程序实现
- 用二分法实现文件查找
- 【c++程序】用二分法查找数据
- 用二级指针实现单链表插入操作
- Java程序实现二分法查找(折半查找)算法
- 指针操作的经典程序
- 用java实现二分法快速查找例程
- 用python和awk实现二分法查找
- 二分法查找C++程序
- 二分法查找C++程序
- 二分法小程序
- 智能指针实现程序示例
- 用程序实现自动的html操作
- 二分法Java实现
- JAVA 二分法查找实现
- matlab实现二分法查找
- 二分法查找实现
- 设计模式--结构型--享元模式
- ArcGIS Runtime数据加载及编辑同步
- MVC小结
- java递归,实现求全排列
- 如何检测和解决端口冲突问题
- 用指针操作实现二分法程序
- EASWeb管理控制台补丁下载OOM解决办法
- maven项目的测试目录中报类找不到异常
- ArcGIS Runtime 快速入门
- Linux定时器的使用
- Introduce for USB Architecture
- CMD
- sql中的group by 和 having 用法解析
- Wifi测试