• 查找


    介绍:

        java中,我们常用的查找有两种:

        1) 顺序(线性)查找

        2) 二分查找

     

    线性查找

    有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称【顺序查找】要求: 如果找到了,就提示找到,并给出下标值。

    object OrderSearch {

    def main(args: Array[String]): Unit = {

    val arr = Array(1,8, 10, 89, 89,1000, 1234)

    val index = orderFind(arr, 89)

    if (index == -1) {

    println("没有查找到~")

    } else {

    println("找到,下标为=" + index)

    }

    }

    def orderFind(arr: Array[Int], value: Int): Int = {

    for (i <- 0 until arr.length) {

    if (arr(i) == value) {

    return i

    }

    }

    -1

    }

    }

     

    二分查找:

    请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数"

     

    课后思考题:

    {1,8, 10, 89, 1000, 10001234} 当一个有序数组中,有多个相同的数值时,如何将所有的数值都查找到,比如这里的 1000.

     

     

     

    二分查找的代码实现

    package com.atguigu.chapter18.search

     

    import scala.collection.mutable.ArrayBuffer

    import util.control.Breaks._

     

    object BinarySearch {

    def main(args: Array[String]): Unit = {

     

    val arr = Array(1, 8, 10, 1000, 1000,1000, 1000, 1000, 1000,1000, 1000,1000, 1234)

    // val index = binarySearch(arr, 0, arr.length - 1, 1000)

    // if (index != -1) {

    // println("找到,下标为" + index)

    // } else {

    // println("没有找到")

    // }

     

    var resArr = binarySearch2(arr, 0, arr.length - 1, 1000)

    resArr = resArr.sortBy((x:Int) => x)

    if (resArr.length != 0) {

    for (index<-resArr) {

    println("找到的索引有" + index)

    }

    }else {

    println("没有找到")

    }

    }

     

    //二分查找的思路

    //1. 先找到中间值

    //2. 然后将中间值和查找值比较

    //2.1 相等,找出

    //2.2 中间值 > 查找值, 向左进行递归查找

    //2.3 中间值 < 查找值, 向右进行递归查找

    // ? 在什么情况下,表示找不到?

    //如果存在值,就返回对应的下标,否则返回-1

    def binarySearch(arr: Array[Int], l: Int, r: Int, findVal: Int): Int = {

     

    //找不到条件?

    if (l > r) {

    return -1

    }

     

    val midIndex = (l + r) / 2

    val midVal = arr(midIndex)

    if (midVal > findVal) {

    //向左进行递归查找

    binarySearch(arr, l, midIndex - 1, findVal)

    } else if (midVal < findVal) { //向右进行递归查找

    binarySearch(arr, midIndex + 1, r, findVal)

    } else {

    return midIndex

    }

     

    }

     

    /*

    课后思考题: {1,8, 10, 89, 1000, 10001234} 当一个有序数组中,有多个相同的数值时,如何将所有的数值都查找到,比如这里的 1000.

    //分析

    1. 返回的结果是一个可变数组 ArrayBuffer

    2. 在找到结果时,向左边扫描,向右边扫描 [条件]

    3. 找到结果后,就加入到ArrayBuffer

    */

    def binarySearch2(arr: Array[Int], l: Int, r: Int,

    findVal: Int): ArrayBuffer[Int] = {

     

    //找不到条件?

    if (l > r) {

    return ArrayBuffer()

    }

     

    val midIndex = (l + r) / 2

    val midVal = arr(midIndex)

    if (midVal > findVal) {

    //向左进行递归查找

    binarySearch2(arr, l, midIndex - 1, findVal)

    } else if (midVal < findVal) { //向右进行递归查找

    binarySearch2(arr, midIndex + 1, r, findVal)

    } else {

    println("midIndex=" + midIndex)

    //定义一个可变数组

    val resArr = ArrayBuffer[Int]()

    //向左边扫描

    var temp = midIndex - 1

    breakable {

    while (true) {

    if (temp < 0 || arr(temp) != findVal) {

    break()

    }

    if (arr(temp) == findVal) {

    resArr.append(temp)

    }

    temp -= 1

    }

    }

    //将中间这个索引加入

    resArr.append(midIndex)

    //向右边扫描

    temp = midIndex + 1

    breakable {

    while (true) {

    if (temp > arr.length - 1 || arr(temp) != findVal) {

    break()

    }

    if (arr(temp) == findVal) {

    resArr.append(temp)

    }

    temp += 1

    }

    }

    return resArr

    }

    }

    }

     

  • 相关阅读:
    JavaScript-5(数组)
    JavaScript-作用域-预解析
    JavaScript-日历生成器
    JavaScript-8行5列表格
    package XXX.i386.rpm is not installed(检查在Linux上安装Oracle所需的pkg时)
    ubuntu13.04下安装jdk7
    Linux远程传输命令之scp使用方法
    Mac OS X中MacPorts安装和使用
    第一天 Linux 是什么
    Javascript与当前项目的思考
  • 原文地址:https://www.cnblogs.com/shuzhiwei/p/11210077.html
Copyright © 2020-2023  润新知