有序数列的二分搜索

二分查找

import java.util.*;public class HW3 {    public static void main(String[] args) {        Scanner in = new Scanner(System.in);      //输入要查找的数        System.out.println("请输入要打印的数据:");        int number = in.nextInt();        Random rd = new Random();       //在数组中随机,注:范围是在打印时标示        int[] arr = new int[11];        for (int i = 0; i < 11; i++)   //对数组的11个数,开始分配值        {            arr[i] = rd.nextInt(50);   //0-49   //对这11个数组赋值        }        Arrays.sort(arr);  // 因为二分搜索是对有序数列使用的,所以先对数组中的数排序        System.out.println(Arrays.toString(arr));    //将有序数组打印出来        int index = Search(arr, number);  //调用search()方法(二分搜索)进行查找          if(index==-1){      //若返回的是-1,则没有找到数              System.out.println("没有查找到该数!!!");          }else{              //若返回为下标,则表示找到了该数           System.out.println("查找的数下标为:"+index);         }

    }

    private static int Search(int[] arr, int number) {     //将所要遍历的数组和所要查找的数值赋给该方法        int start = 0;    //先定义三个变量,用来缩减范围        int end = arr.length - 1;        int middle = 0;

        while (end >= start) {       //end>=start,说明数组还没有查完,则继续查找            middle = (start + end) / 2;            if (number < arr[middle]) {                end = middle - 1;            } else if (number > arr[middle]) {                start = middle + 1;            } else {                return middle;        //当找到该数,则返回下标            }

        }        return -1;    //若end>start,表明数组已遍历完也没有找到所要找到数,此时返回-1;    }}

运行结果:

 

以上是二分查找的代码实现,其实在Java中已经有可以直接调用的二分查找函数,使用方法具体如下:

 1 import java.util.*;
 2 public class HW3 {
 3     public static void main(String[] args) {
 4         Scanner in = new Scanner(System.in);      //输入要查找的数
 5         System.out.println("请输入要打印的数据:");
 6         int number = in.nextInt();
 7         Random rd = new Random();       //在数组中随机,注:范围是在打印时标示
 8         int[] arr = new int[11];
 9         for (int i = 0; i < 11; i++)   //对数组的11个数,开始分配值
10         {
11           arr[i] = rd.nextInt(50);   //0-49   //对这11个数组赋值
12         }
13         Arrays.sort(arr);  // 因为二分搜索是对有序数列使用的,所以先对数组中的数排序
14         System.out.println(Arrays.toString(arr));    //打印排好序的数组
15         int index = Arrays.binarySearch(arr, number);  //调用search()方法(二分搜索)进行查找
16         if(index<-1){      //若返回的是-1,则没有找到数
17             System.out.println("没有查找到该数!!!");
18         }else{              //若返回为下标,则表示找到了该数
19             System.out.println("查找的数下标为:"+index);
20         }
21     }
22
23 }

Arrays.binarySearch(arr,number)方法的底层代码:

(注意与上述代码不同的是,调用此方法查找数值,若没有找到则返回的是负数,--(insertion point)--1)

Arrays.binarySearch(arr , formindex, endindex, number)方法的底层代码:

原文地址:https://www.cnblogs.com/ljl150/p/11583792.html

时间: 2024-08-02 22:04:32

有序数列的二分搜索的相关文章

找出旋转有序数列的中间值python实现

题目给出一个有序数列随机旋转之后的数列,如原有序数列为:[0,1,2,4,5,6,7] ,旋转之后为[4,5,6,7,0,1,2].假定数列中无重复元素,且数列长度为奇数.求出旋转数列的中间值.如数列[4,5,6,7,0,1,2]的中间值为4.输入 4,5,6,7,0,1,2 输出 4 输入样例11,2,34,5,6,7,0,1,212,13,14,5,6,7,8,9,10输出样例1249 方法1 排序后直接取. def solution(line): #line = "4,5,0,1,2&qu

LeetCode Summary Ranges (统计有序数列范围)

题意:给出个有序不重复数列(可能负数),用缩写法记录这个数列. 思路:找每个范围的起始和结束即可. 1 class Solution { 2 public: 3 vector<string> summaryRanges(vector<int>& nums) { 4 if(nums.empty()) return vector<string>(); 5 vector<string> vect; 6 for(int i=0; i<nums.size

插入元素到有序数组,二分搜索查找插入位置

当一个数组有序时,要向其中插入元素,可以先使用二分搜索查找其要插入的位置,位置确定后可以执行插入操作. 其中二分搜索的循环体如下(部分代码,具体见文章最后): while(low<=high){//循环条件 mid = (low+high)/2; if(a[mid]<val){ low = mid+1; }else if(a[mid]>val){ high = mid-1; }else{ insert(a,last,mid,val);//a[mid]==val,执行插入操作 return

多个有序数列中查找第k小值

问题描述:现有n个有序序列如(2,3,9),(3,5,11,23),(1,4,7,9,15,17,20),(8,15,35,9),(20,30,40),请求出第k小值. 问题分析:可用多路归并排序将所有序列进行排序后取第k个值,但是只要求求出第k小值将所有数组排序未免显得有点浪费,所以我们可以使用包含k个元素的堆完成,对于每组元素取出前k小的,依次进行比较,得到总的前k小 执行步骤: 一.建初堆:从第一组数中取出前k小的元素建初始大根堆(若不足k个则取全部元素), 二. 1 .补充堆:若堆中元素

【LeetCode】Search in Rotated Sorted Array——旋转有序数列找目标值

[题目] Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in the array return its index, otherwise return -1. You may assume no d

logn+m复杂度找两个有序数列的中位数

class Solution { public: double fun(vector<int> nums1,int n,vector<int> nums2,int m,int k) { if(nums1.size()-n>nums2.size()-m) return fun(nums2,m,nums1,n,k); if(n==nums1.size()) return nums2[k-1+m]; if(k==1) return min(nums1[n],nums2[m]); i

两组有序数列的中位数

两组升序排列的数组A[m]和B[n], 求他们的中位数. 注意,中位数的概念哦-相信你会百度一下的- 格式: 第一行输入数字m,接下来一行输入数组A[m], 第三行输入数字n,第四行输入数组B[n],接下来输出中位数.两个数组的长度都不超过1000. 注意,需要保留5位小数哦-所以,你设计函数的时候请设计成double类型哦- 样例输入 1 3 5 1 2 4 5 6 样例输出 3.50000 package jsk; import java.util.Scanner; public class

两个有序数列的合并

题目描述 已知数组a中有m个按升序排列的元素,数组b中有n个按降序排列的元素,编程将a与b中的所有元素按降序存入数组c中. 输入 输入有两行,第一行首先是一个正整数m,然后是m个整数:第二行首先是一个正整数n,然后是n个整数,m, n均小于等于1000000. 输出 输出合并后的m+n个整数,数据之间用空格隔开.输出占一行. 样例输入 4 1 3 5 7 3 6 4 2 样例输出 7 6 5 4 3 2 1 提示 试图排序的孩子们要小心了~~~~~~ 1 # include <stdio.h>

JS - 有序数列

************************ 作者:张启卫 时间: 2017年6月3号 功能: * 介绍以索引进行排序的数据集合. ************************ 1. 数组对象 1.1 创建数组 var arr = new Array(element0, element1, ..., elementN); var arr = Array(element0, element1, ..., elementN); var arr = [element0, element1, .