二分搜索算法

题目:设 a [ 0 : n - 1 ] 是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素 x 不在数组中时,返回小于 x 的最大元素的位置 i 和大于 x 的最小元素位置 j 。当搜索元素在数组中时, i 和j相同,均为 x 在数组中的位置。并对自己的程序进行复杂性分析。

import java.util.Arrays;
import java.util.Scanner;

public class Main {

	static int x;// 需要查找的数据

	// 形参i,j是数组下标,arr是原数组,answer是存储答案的数组
	static void getij(int i, int j, int[] arr, int[] answer) {
		if (i > j) {
			// x不在数组中的情况
			answer[0] = j;
			answer[1] = i;
			return;
		}
		int len = j - i + 1;// 加不加1都可以

		if (x == arr[len / 2 + i]) {
			// x在数组中的情况
			Arrays.fill(answer, len / 2 + i);// java api 方法,作用是将数组answer里的元素都赋值为len/2+1
		} else if (x < arr[len / 2 + i]) {
			getij(i, len / 2 + i - 1, arr, answer);
		} else {
			getij(len / 2 + i + 1, j, arr, answer);
		}
	}

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);

		while (scanner.hasNext()) {
			int n = scanner.nextInt();

			int[] arr = new int[n];
			for (int i = 0; i < n; i++) {
				arr[i] = scanner.nextInt();
			}

			x = scanner.nextInt();

			// 答案 存储的是数组下标 i = answer[0]; j = answer[1]
			int[] answer = new int[2];
			getij(0, n - 1, arr, answer);// 0,n-1都是数组的下标

			System.out.println(answer[0] + " " + answer[1]);
		}
		scanner.close();
	}
}

二分搜索算法

时间: 2024-10-11 19:41:34

二分搜索算法的相关文章

改写二分搜索算法

本算法的题目来源<计算机算法与分析> 设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j.当搜索元素在数组中时,i和j相同,均为x在数组中的位置. 提示:若x小于全部数值,则输出:-1 0 若x大于全部数值,则输出:n-1的值 n的值. 一.以下附上源码和分析 1 #include <iostream> 2 using namespace std; 3 void ch_bin_search_while(i

『嗨威说』算法设计与分析 - 算法第二章上机实践报告(二分查找 / 改写二分搜索算法 / 两个有序序列的中位数)

本文索引目录: 一.PTA实验报告题1 : 二分查找 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 改写二分搜索算法 2.1 实践题目 2.2 问题描述 2.3 算法描述 2.4 算法时间及空间复杂度分析 三.PTA实验报告题3 : 两个有序序列的中位数 3.1 实践题目 3.2 问题描述 3.3 算法描述 3.4 算法时间及空间复杂度分析 四.实验心得体会(实践收获及疑惑) 一.PTA实验报告题1 : 二分查找 1.1 实践

[一些基础算法的小心得] -- 二分搜索算法

对分搜索算分也叫二分搜索算法也叫,英文则是binary-search  algorithm.其概念非常的基础,这里不再描述.但问题是我们能否不加思考的写出一个二分搜索算法并一次运行成功呢? 我们知道其核心部分的伪码非常简单(短): 并且我们也知道,对于一个规模为n的已排序数组,任何基于比较的搜索算分所需最坏情况时间为O(n). 那么下面这种算法是否正确呢?如果正确的话,最坏情况时间是什么? 那么下面这种算法呢? 以上三种写法,你能区分出哪种是正确的哪种是不正确的吗,不正确的部分是哪里如何修改呢.

有序和无序数组的二分搜索算法

题目意思 1.给定有序数组A和关键字key,判断A中是否存在key,如果存在则返回下标值,不存在则返回-1. 2.给定无序数组A和关键字key,判断A中是否存在key,如果存在则返回1,不存在则返回0. 对于1.2问题,我们都可以简单的写出O(n)的从头到尾为的扫描算法,这里就不在累赘,这里我们讨论的是基于二分查找的算法,使其时间在渐进意义上达到O(logn). 对于有序的数组,很"容易"写出基于二分的函数. 那么问题2,对于无序数组,怎么查找呢?这里我们用到了快速排序的划分原则.算法

二分的几种简单应用——入门

---恢复内容开始--- 说起二分,最基础的二分搜索算法就不用了吧(最难的还际应用啊感觉)--实现起来很简单,搜索区间不断减半--唔--嘛--简单甩个模板好了(●'?'●) 下面开始学习二分的几种应用啦~~ 1.假定一个解并判断是否可行 一般用于求解判断条件较为简单的最大化和最小化的问题,不断缩小答案的区间. 怎么说呢--举个栗子好了 Cable master POJ - 1064 Inhabitants of the Wonderland have decided to hold a regi

JAVA源码走读(二)二分查找与Arrays类(未完)

给数组赋值:通过fill方法. 对数组排序:通过sort方法,按升序.比较数组:通过equals方法比较数组中元素值是否相等.查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作. 使用如下: int[] array = new int[5]; //填充数组 Arrays.fill(array, 5); System.out.println("填充数组:Arrays.fill(array, 5):"); test.output(array); //将数组的第

POJ 2391-Ombrophobic Bovines(网络流_最大流+floyd+二分)

Ombrophobic Bovines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15485   Accepted: 3361 Description FJ's cows really hate getting wet so much that the mere thought of getting caught in the rain makes them shake in their hooves. They h

二分查找真的那么简单吗?——算法第二章上机实践报告

一.        实践题目 改写二分搜索算法 (20 分) 题目来源:<计算机算法设计与分析>,王晓东 设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j.当搜索元素在数组中时,i和j相同,均为x在数组中的位置. 输入格式: 输入有两行: 第一行是n值和x值: 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔. 输出格式: 输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j.当搜索元素在

SparseArray到底哪点比HashMap好

SparseArray是android里为<Interger,Object>这样的Hashmap而专门写的class,目的是提高效率,其核心是折半查找函数(binarySearch). HashMap底层是一个Hash表,是数组和链表的集合实现,有需要的可以去看看我关于Hashmap的分析.hashmap源码分析 所以Android开发中官方推荐:当使用HashMap(K, V),如果K为整数类型时,使用SparseArray的效率更高. 那我们看源码来分析下, 构造函数: /** * 存储索