scala 实现二分查找

文章目录


对于一个无序的集合,查找一个元素的时间复杂度是 o(n)
二分查找适应于有序的查找元素,时间复杂度是 o(logn)

package com.zyd

object BinarySearch {
  def main(args: Array[String]): Unit = {
    val arr = Array(10, 20, 30, 50, 60, 100, 200, 1000)
    println(binarySearch(arr, 50, 0, arr.length - 1))
  }

  /**
   * 二分查找
   * @param array 有序数组
   * @param ele   需要查找的元素
   * @param low   开始索引
   * @param high  结束索引
   */
  def binarySearch(arr: Array[Int], ele: Int, low: Int, high: Int): Int = {
    if (low > high) -1
    else {
      val midIndex: Int = (low + high) / 2  // 折半查找
      val midValue: Int = arr(midIndex) // 折半位置的值
      if (ele == midValue) midIndex  // 如果相等, 则直接返回折半位置
      else if (ele < midIndex) { // 元素小于折半位置的值, 则去左边查找
        binarySearch(arr, ele, low, midIndex - 1)
      } else {  // 如果元素大于折半位置的值, 则去右边查找
        binarySearch(arr, ele, midIndex + 1, high)
      }
    }
   }
}

当遇到相同元素的时候,查找快速解决方案

import util.control.Breaks._


def main(args: Array[String]): Unit = {
    val arr = Array(10, 20, 30, 50, 50, 50, 60, 100, 200, 1000)
    println(binarySearchSame(arr, 0, arr.length - 1, 50))
  }


  /**
   *
   * @param arr
   * @param l
   * @param r
   * @param high
   * @return
   */
  def binarySearchSame(arr: Array[Int], l: Int, r: Int, fliVal: Int): ArrayBuffer[Int] = {
    //找不到条件
    if (l > r) {
      return ArrayBuffer()
    }
    val midIndex = (1 + r) / 2
    val midVal = arr(midIndex)
    if (midVal > fliVal) {
      binarySearchSame(arr, l, midIndex - 1, fliVal)
    } else if (midVal < fliVal) {
      //向右进行递归查找
      binarySearchSame(arr, midIndex + 1, r, fliVal)
    } else {
      //定义一个可变数组
      val resArr = ArrayBuffer[Int]()
      //向左边扫描
      var temp = midIndex - 1
      breakable {
        while (true) {
          if (temp < 0 || arr(temp) != fliVal) {
            break()
          }
          if (arr(temp) == fliVal) {
            resArr.append(temp)
          }
          temp -= 1
        }
      }
      // 将中间索引加入
      resArr.append(midIndex)
      //向右边扫描
      temp = midIndex + 1
      //向右边扫描
      breakable {
        while (true) {
          if (temp > arr.length - 1 || arr(temp) != fliVal) {
            break()
          }
          if (arr(temp) == fliVal) {
            resArr.append(temp)
          }
          temp += 1
        }
      }
      return resArr

    }


  }

你可能感兴趣的:(数据结构和算法)