二分法查找

文章展示了Java编程中的两种查找算法:在有序数组(如整数或字符串)中使用二分查找(如`Fri04`和`Fri05`),以及在无序数组中使用双指针遍历(如`eg1`)。通过实例代码演示了如何在不同场景下找到指定元素的索引。
摘要由CSDN通过智能技术生成

eg1

package Fri;


public class Fri04 {
	public static void main(String[] args) {
		int[] num= {1,2,3,4,5,6,7,8,9};
		int target=4;
		int index=-1;
		int low=0,high=num.length-1;
		while(low<=high) {
			//求中间数
			int mid=(low+high)/2;
			//判断中间数与目标值是否相等
			if(num[mid]==target) {
				index=mid;
				break;
			}
			if(num[mid]<target) {
				low=mid+1;
				index=low;
				break;
			}
			if(num[mid]>target) {
				high=mid-1;
				index=high;
				break;
			}
		}
		System.out.println(index);
	}
}

eg2

package Fri;

import java.util.Arrays;

public class Fri05 {
	public static void main(String[] args) {
		String[] contact = { "Megatron", "s司马铁锤", "Laden", "angelababy", "b比尔盖饭", "I林平之", "BIGBANG", "Adele Adkins",
				"m马云", "Gaddafi", "郭德纲", "m马伯庸", "Ma Tong Seok" };
		String target = "m马云";
		//方法一
//		int index=Arrays.binarySearch(contact, target);
//		System.out.println(index);
		//方法二
		int low = 0, high = contact.length - 1;
		int index = -1;
		Arrays.sort(contact);
		System.out.println(Arrays.toString(contact));
		while (low <= high) {
			int mid = (low + high) >> 1;
			if (contact[mid].compareTo(target) == 0) {
				index = mid;
				break;
			}
			if (contact[mid].compareTo(target) > 0) {
				low = mid - 1;
				index = low;
				break;
			}
			if (contact[mid].compareTo(target) < 0) {
				low = mid + 1;
				index = high;
				break;
			}
		}
		System.out.println(index);
	}
}

eg3

package Fri;


public class eg2 {
	// 使用二分查找法,查找有序数组keys中指定字符target的下标位置。
	// 字符数组
	public static void main(String[] args) {
		char[] keys = { 'a', 'b', 'd', 'f', 'h', 'k', '1', 'm', 'n', 'w' };
		// 目标字符
		char target = 'f';
		int index = -1;
		int low = 0, high = keys.length - 1;
		while(low<=high) {
			int mid=(low+high)/2;
			if(keys[mid]==target) {
				break;
			}
			else if(keys[mid]<target) {
				low=mid+1;
				index=low;
				break;
			}
			else if(keys[mid]>target) {
				high=mid-1;
				index=high;
				break;
			}
		}
		System.out.println(index);
	}

}

eg4

package Fri;

//使用双指针遍历,查找无序数组phoneNumberArray中指定字符串target的下标位置。
import java.util.Scanner;

public class eg1 {
	public static void main(String[] args) {
		// 手机尾号数组
		String[] phoneNumberArray = { "4392", "9961", "1794", "4431", "9433", "2784", "8961", "9981", "3391", "3967",
				"3721" };
		// 目标尾号
		try (Scanner input = new Scanner(System.in)) {
			String target = input.next();
			int index = -1;
			for (int i = 0, k = phoneNumberArray.length-1; i <= k; i++, k--) {
				if (phoneNumberArray[i] == target) {
					index = i;
					break;
				}
				if (phoneNumberArray[k] == target) {
					index = k;
					break;
				}
			}
			System.out.println(index);
		}

	}
}

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值