自己写二分法……(普通循环和运用递归思想)
2011-10-24 17:59
232 查看
(1)递归思想实现元素的二分法查找
//在上面的算法中必须保证元素是按照升序排列的。
int min(end-start)/2+start;
得到中间位置的索引,将中间位置索引对应的元素与要查找的元素key进行比较。
如果索引位置的对应值正好等于key的值。则返回中间位置的索引即为查找的元素的索引。
如果key的值大于中间位置的值,也就是说key的值在中间位置的“后半部分”(升序排列)这时再将原来的中间位置向后挪动一位变为重新 折半分的 起始索引位置。终止索引位置不变,再进行查找key的值。若是key的值再大于重新确定的mid的值,再重复上面操作,如此递归……
如果key的值小于中间位置的值,也就是说key的值在中间位置的“前半部分”,这时再将原来的中间位置向前挪动一位变为重新 折半分的 终止位置。……同样也是这样递归。
当起始位置的索引大于或等于终止未指定的索引时,返回 -1 表示错误。
当mid的值为小数时,取小于它的最大整数作为中间位置。
(1)普通循环实现二分法查找
//在使用二分法之前需要对元素进行升序排列
传递一个数组和要查找的元素调用binSearch()方法。
同样取得数组的中间位置作为比较的起始位置。
先将值遇arrray[mid]进行比较,当二者相等的时候,返回mid的位置即为查找的值的索引。使用start<=end作为条件进行循环。当值小于当前的array[mid]时,当前mid的索引值前移一位,因为key的值在mid的前面。
……同样的思想分析当key>=array[mid]也是合理的。
当不符合要求(没有按照升序或start>end)时,就会返回 -1 。
package org.media; import java.util.Arrays; public class GoTest{ public static void main(String args[]){ int a[]={0,1,9,5,7}; Arrays.sort(a); System.out.println(binSearch(a,0,a.length-2,5)); } public static int binSearch(int a[], int start, int end, int key) { int mid = (end - start) / 2 + start; if (a[mid] == key) { return mid; } if (start >= end) { return -1; } else if (key>a[mid]) { return binSearch(a, mid + 1, end, key); } else if (key<a[mid]) { return binSearch(a, start, mid - 1, key); } return -1; } } |
int min(end-start)/2+start;
得到中间位置的索引,将中间位置索引对应的元素与要查找的元素key进行比较。
如果索引位置的对应值正好等于key的值。则返回中间位置的索引即为查找的元素的索引。
如果key的值大于中间位置的值,也就是说key的值在中间位置的“后半部分”(升序排列)这时再将原来的中间位置向后挪动一位变为重新 折半分的 起始索引位置。终止索引位置不变,再进行查找key的值。若是key的值再大于重新确定的mid的值,再重复上面操作,如此递归……
如果key的值小于中间位置的值,也就是说key的值在中间位置的“前半部分”,这时再将原来的中间位置向前挪动一位变为重新 折半分的 终止位置。……同样也是这样递归。
当起始位置的索引大于或等于终止未指定的索引时,返回 -1 表示错误。
当mid的值为小数时,取小于它的最大整数作为中间位置。
(1)普通循环实现二分法查找
package org.media; import java.util.Arrays; public class GoTest{ public static void main(String args[]){ int a[]={9,7,6,5,2}; Arrays.sort(a); System.out.println(binSearch(a,9)); } public static int binSearch(int array[],int key){ int mid=array.length/2; int start =0; int end=array.length-1; if(key==array[mid]) return mid; while(start<=end){ mid=(end-start)/2+start; if(key <array[mid]){ end=mid-1; }else if(key >array[mid]){ start=mid+1; }else{ return mid; } } return -1; } } |
传递一个数组和要查找的元素调用binSearch()方法。
同样取得数组的中间位置作为比较的起始位置。
先将值遇arrray[mid]进行比较,当二者相等的时候,返回mid的位置即为查找的值的索引。使用start<=end作为条件进行循环。当值小于当前的array[mid]时,当前mid的索引值前移一位,因为key的值在mid的前面。
……同样的思想分析当key>=array[mid]也是合理的。
当不符合要求(没有按照升序或start>end)时,就会返回 -1 。
相关文章推荐
- 运用递归搞定单次循环打印菱形的问题
- C语言使用普通循环方法和递归求斐波那契序列示例代码
- 运用递归思想实现剪切任意文件夹
- 经典的SQL语句,列是可变的动态行列转换,运用了循环的思想
- 自己写的一个根据结点名称查找CTreeCtrl树中对应结点的方法(用的是递归思想)
- 简单谈谈 C/C++ 递归的思想,实现,以及和循环的关系
- 练习 4-12 运用 printd 函数的设计思想编写一个递归版本的 itoa 函数,即通过递归 调用把整数转换为字符串
- 二分法实现(循环 + 递归)
- 【郝斌数据结构自学笔记】53-56_一个函数为什么可以自己调用自己_递归必须满足三个条件_循环和递归的比较
- 使用循环和递归方法实现二分法搜索
- 排列(自己写的运用了许多循环结构)
- 二分法查找(递归和循环)
- 递归:运用递归思想解题
- 二分法快速计算x的n次幂(递归和循环实现)
- python 二分法查找实例(递归、循环)
- 对python dataframe ,list 之间的循环,迭代,还有转换的运用的自己的小例子
- 自己写的一个根据结点名称查找CTreeCtrl树中对应结点的方法(用的是递归思想)
- 【C语言】求取第n个斐波那契数的时间复杂度、空间复杂度分析,用三种方式实现(普通递归,循环,优化递归)
- 递归和循环---从EasyUI Tree 发现自己的硬伤
- 自己写的Fibonacci 数列计算代码,基于MATLAB ,递归思想!