文章目录


对于一个无序的集合,查找一个元素的时间复杂度是 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

}


}