当前位置:首页 » 操作系统 » 折半查找算法java

折半查找算法java

发布时间: 2022-05-19 12:23:44

java一个折半查找的程序

这个是我刚写,在给出代码之前,我先声明一下,至于你说的时间复杂度对我来说,是天书,我不懂

我只知道用循环的时候,谁用的次数少,能找出东西,谁就快!

这个是网络到的你所问的折半复杂度:O(log2n),倘若你真是大神着迷这个,你不妨看看算法导论!

对于目前我来说,我就只认一个理,谁快而且能找的准谁就好用!

下面我用折半查找,和普通查找同时查找一个数字的时候用的次数对比,一目了然!

说实话,我也是初学者,而且对于数组这块,排序,我甚是着迷,感觉这些原创大脑真的厉害...非常佩服!

闲话少说,上代码:声明下这个我个人原创for二分查找呵呵:

publicclassBinarySearch
{
publicstaticvoidmain(String[]args)
{
System.out.println(" ==========折半查找算法========== ");

int[]arr={11,25,36,44,46,51,60,61,62,63,75,79,88};

System.out.println("目标索引位置:"+init(arr,62)+" ");
System.out.println("目标索引位置:"+init1(arr,62)+" ");

}
//折半查找!
privatestaticintinit(int[]arr,inta)
{
inttem=-1,n=0;
for(intt=0,w=arr.length-1,z=(w+t)/2;t<=w;)
{
n++;
if(a>arr[z])
t=z+1;
elseif(a<arr[z])
w=z-1;
elseif(a==arr[z])
{
tem=z;
break;
}
else
break;
z=(w+t)/2;
}
System.out.println("二分查找耗时n="+n+"次");
returntem;
}

//普通查找!
privatestaticintinit1(int[]arr,inta)
{
inttem=-1,n=0;
for(inti=0;i<arr.length;i++)
{
n++;
if(a==arr[i])
{
tem=i;
break;
}
}
System.out.println("普通查找耗时n="+n+"次");
returntem;
}
}

这里有个博客专门对算法解析:还算比较通俗易懂的,你可以参考看看:

http://blog.csdn.net/firefly_2002/article/details/8008987

⑵ 用java实现,通过键盘输入一个数,在排序后的数组中,采用折半查找法查找该数在数组中的 位置。

import java.util.Scanner;

public class Test {
static int bsearch( int[] a, int v ) {
int l, r;
l = 0; r = a.length-1;
while ( l <= r ) {
int m = (l+r)/2;
if ( a[m] == v ) return m; else
if ( a[m] > v ) r = m-1; else
if ( a[m] < v ) l = m+1;
}
return -1;
}

public static void main( String[] args ) {
int[] a = { 1,3,5,7,9 };
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要找的值:");
int num = sc.nextInt();
System.out.println( "找到 " + num + " 在数组的位置是:" + bsearch( a, num ) );
}
}

⑶ 怎样使用java在排好序的序列中用折半查找的方法查找data的位置啊求解~

设置 min = 0 , max = list.size m = (min + max )/2
while(min<=max)
if(list[m] <data) max=m ;m= (min + max )/2
else if (list[m] >data) min = m ;m= (min + max )/2
else m 就是你要找的位置了
大概就是这个意思吧
折半查找就是找到中间点,和data比较大小,然后缩短范围,依次递归,找到data

⑷ java数据结构---折半查找的递归算法,望高手指点!

package souce;

public class Search {

public static boolean binarySearch(int[] a,int x,int left,int right){//二分查找的主方法
if(x==a[left]||x==a[right])return true; //找到,返回真
if(right-left<2)return false; //可找元素小于3,由上一步说明没有,返回假
int mid = (left+right)/2; //否则:二分
if(x==a[mid])return true; //中间元素OK,返回OK
else{ //否则
if(x>a[mid])return binarySearch(a,x,mid+1,right);//大于中间元素找右半部分
else return binarySearch(a,x,left,mid-1); //小于中间元素找左半部分
}
}

public static final int[] sort(int[] a){ //int数组 的 排序方法
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length; j++) {
if(a[i]<a[j]){
swap(a,i,j);
}
}

}
return a;
}

private static void swap(int[] a, int i, int j) { //数组元素交换子函数
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}

public static void print(int[] a){ //打印函数
System.out.println();
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]);
if(i!=a.length-1)System.out.print(",");
}
System.out.println();
}

public static void main(String[] args) { //测试方法
int[] a = {90, 12, 21, 32, 51, 78, 87, 98};
print(sort(a));
System.out.println(binarySearch(sort(a), 40, 0, a.length-1));
}
}

⑸ 用二分法查找(折半查找)java

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

二分查找优缺点

优点是比较次数少,查找速度快,平均性能好;

其缺点是要求待查表为有序表,且插入删除困难。

因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
使用条件:查找序列是顺序结构,有序。


过程

首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

利用循环的方式实现二分法查找

public class BinarySearch {
public static void main(String[] args) {
// 生成一个随机数组 int[] array = suiji();
// 对随机数组排序 Arrays.sort(array);
System.out.println("产生的随机数组为: " + Arrays.toString(array));

System.out.println("要进行查找的值: ");
Scanner input = new Scanner(System.in);
// 进行查找的目标值 int aim = input.nextInt();

// 使用二分法查找 int index = binarySearch(array, aim);
System.out.println("查找的值的索引位置: " + index);

}

/** * 生成一个随机数组 *
* @return 返回值,返回一个随机数组 */
private static int[] suiji() {
// random.nextInt(n)+m 返回m到m+n-1之间的随机数 int n = new Random().nextInt(6) + 5;
int[] array = new int[n];
// 循环遍历为数组赋值 for (int i = 0; i < array.length; i++) {
array[i] = new Random().nextInt(100);
}
return array;
}

/** * 二分法查找 ---循环的方式实现 *
* @param array 要查找的数组 * @param aim 要查找的值 * @return 返回值,成功返回索引,失败返回-1 */
private static int binarySearch(int[] array, int aim) {
// 数组最小索引值 int left = 0;
// 数组最大索引值 int right = array.length - 1;
int mid;
while (left <= right) {
mid = (left + right) / 2;
// 若查找数值比中间值小,则以整个查找范围的前半部分作为新的查找范围 if (aim < array[mid]) {
right = mid - 1;
// 若查找数值比中间值大,则以整个查找范围的后半部分作为新的查找范围 } else if (aim > array[mid]) {
left = mid + 1;
// 若查找数据与中间元素值正好相等,则放回中间元素值的索引 } else {
return mid;
}
}
return -1;
}}
运行结果演示:

总结:

递归相较于循环,代码比较简洁,但是时间和空间消耗比较大,效率低。在实际的学习与工作中,根据情况选择使用。通常我们如果使用循环实现代码只要不是太繁琐都选择循环的方式实现~

⑹ java程序,用折半查找法判断一个从键盘输入的数是否包含在该指定区间的数组元素中。

是不是这样的。。。。作业明天交,十分捉急
编写一个java 应用程序,首先对一个数组指定区间内包含的元素进行排序,然后使用折半查找法判断一个从键盘输入的数是否包含在该指定区间的数组元素中。

参考使用的方法:

java.util.Arrays类中实现数组指定区间包含的元素排序的方法是:

void sort(double[] a, int fromIndex,int
toIndex)

java.util.Arrays类中实现在数组指定区间包含的元素中采用折半查找算法查找指定数据的方法是:

int binarySearch(double[] a,
int
fromIndex, int
toIndex,
double
key)

⑺ 什么叫java中的二分查找法

1、算法概念。

二分查找算法也称为折半搜索、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。请注意这种算法是建立在有序数组基础上的。

2、算法思想。

①搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;

②如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。

③如果在某一步骤数组为空,则代表找不到。

这种搜索算法每一次比较都使搜索范围缩小一半。

3、实现思路。

①找出位于数组中间的值,并存放在一个变量中(为了下面的说明,变量暂时命名为temp);

②需要找到的key和temp进行比较;

③如果key值大于temp,则把数组中间位置作为下一次计算的起点;重复① ②。

④如果key值小于temp,则把数组中间位置作为下一次计算的终点;重复① ② ③。

⑤如果key值等于temp,则返回数组下标,完成查找。

4、实现代码。

/**
*description:二分查找。
*@paramarray需要查找的有序数组
*@paramfrom起始下标
*@paramto终止下标
*@paramkey需要查找的关键字
*@return
*/
publicstatic<EextendsComparable<E>>intbinarySearch(E[]array,intfrom,intto,Ekey)throwsException{
if(from<0||to<0){
("paramsfrom&lengthmustlargerthan0.");
}
if(from<=to){
intmiddle=(from>>>1)+(to>>>1);//右移即除2
Etemp=array[middle];
if(temp.compareTo(key)>0){
to=middle-1;
}elseif(temp.compareTo(key)<0){
from=middle+1;
}else{
returnmiddle;
}
}
returnbinarySearch(array,from,to,key);
}

⑻ 关于java中根据折半查找法创建二叉树

public static int binarySearch(int[] table, int value) //折半查找算法,数组元素已按升序排列
{ //若查找成功返回元素下标,否则返回-1
if (table!=null)
{
int low=0, high=table.length-1; //查找范围的下界和上界
while (low<=high) //边界有效
{
int mid = (low+high)/2; //中间位置,当前比较元素位置
System.out.print(table[mid]+"? ");
if (table[mid]==value)
return mid; //查找成功
else
if (table[mid]>value) //给定值小
high = mid-1; //查找范围缩小到前半段
else
low = mid+1; //查找范围缩小到后半段
}
}
return -1; //查找不成功
}

⑼ java实现折半查找 循环结束的条件看不懂

二分法查找(折半查找)的时间复杂度是O(log2n)

即是最坏的情况比较次数是2为底2n的对数。也就数如果数组长度为2,最坏的情况比较2两次;数组长度为16,最坏的情况比较5次;数组长度1204,最坏的情况是比较11次 就可以找到这个值或者确定找不到这个值。

你的代码就是通过判断比较的次数来决定是否结束循环,当已比较(循环)次数大于最坏情况的次数还没有结束(number != a[middle]),则说明数组中不存在这个值。不过这里是用的N/2来近似的判断。

另一种更普遍的写法

publicclassDemo{
publicstaticvoidmain(String[]args){

//你原来的代码

System.out.println(Arrays.toString(a));
Scannerscanner=newScanner(System.in);
System.out.println("输入整数,程序判断该整数是否在数组中:");
intnumber=scanner.nextInt();

intindex=binary(a,number);
if(index==-1){
System.out.printf("%d不在数组中. ",number);
}else{
System.out.printf("%d在数组中,在数组中的位置下标是%d.",number,index);
}
}

privatestaticintbinary(int[]array,intvalue){
intstart=0;
intend=array.length-1;
while(start<=end){
intmiddle=(start+end)/2;
if(value==array[middle]){
returnmiddle;
}elseif(value>array[middle]){
start=middle+1;
}else{
end=middle-1;
}
}
return-1;
}
}

⑽ 用JAVA写一个完整的折半查找法!!!

import java.util.Scanner;

public class b {

/**
*
* *折半查找法,又称十分法查找 查找的对象是一个按序排好的数组
*/

public static void main(String[] args) {

int[] initVals = { 9, 12, 37, 53, 67, 71, 89, 122, 290, 435, 555, 888,
1104, 1111, 2222, 3333, 21343, 43256, 56778300 };

for (int i = 0; i < initVals.length; i++)

{

System.out.print(initVals[i] + "、");

}

Scanner cin = new Scanner(System.in);

while (cin.hasNext())

{
int targetVal = cin.nextInt();

b bq = new b();

int postion = bq.query(initVals, targetVal);

if (postion == -1)
System.out.println("没有找到");

else
System.out.println("要查找的数字在数组中的第 " + (postion + 1) + "个位置");
}
}

/*
*
* 29 29 * @param values 要找的数组对象
*
* 30 30 * @param targetVal 要找的目标数字
*
* 31 31 * @return -1 没有找到,返回-1
*
* 32 32
*/

public int query(int[] initVals, int targetVal) {

int lowBound = 0;
int upBound = initVals.length - 1;

// 相当于一个指针,指向下一个要比的数字

int nowPostion;

while (true) {

// 指向现在所有数字的中间,没有整除时向下取整,如7/2=3

nowPostion = (lowBound + upBound) / 2;

// 如果现在这个数字就是了,返回现在的编号

if (initVals[nowPostion] == targetVal) {

return nowPostion;

}

// 如果上界小于下界时,说明已经找完全部了,返回-1表示没有找到

else if (lowBound > upBound) {

return -1;

}

// 还可以继续找
else {

// 当前指针的数比targetVal要小,那么要往小的方向继续找

if (initVals[nowPostion] < targetVal) {

lowBound = nowPostion + 1;

}

// 当前指针的数比targetVal要大,那么要往大的方向继续找

else {

upBound = nowPostion - 1;
}

}
}

}

}

热点内容
防盗器编程 发布:2025-01-13 17:24:39 浏览:896
联通电信服务器怎么不卡顿 发布:2025-01-13 17:21:30 浏览:818
科沃兹低配可以升级哪些配置 发布:2025-01-13 17:09:26 浏览:327
android判断数据库是否存在 发布:2025-01-13 17:08:17 浏览:331
ie脚本运行错误 发布:2025-01-13 17:08:05 浏览:620
python中或者怎么表示 发布:2025-01-13 16:32:33 浏览:288
易达加密锁 发布:2025-01-13 16:27:23 浏览:514
前端编译工具配置 发布:2025-01-13 16:26:43 浏览:585
数据库百度云 发布:2025-01-13 16:19:38 浏览:539
java连接sqlite数据库 发布:2025-01-13 16:19:36 浏览:768