二分法查找 demo
1. 代码
package dichotomy
/**
* 二分法查找 demo
* 题目:有一个从小到大的有序数组如{1,2,3,3,5,7,10}, 有一个数字5,查找这个数在此数组中的下标
*/
class DichotomyTest {
companion object {
@JvmStatic
fun main(args: Array<String>) {
println("DichotomyTest")
normalMethod(intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 6)
normalMethod(intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 9)
dichotomyMethod(intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 6)
dichotomyMethod(intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 9)
}
// 遍历匹配查找定位法
private fun normalMethod(data: IntArray, key: Int) {
println("[遍历匹配查找定位法] 源数据:${data.toList()}")
var count = 0
for (i in data.indices) {
count ++
if (data[i] == key) {
println("----> 查找次数: $count, 下标:$i")
break
}
}
}
// 二分法查找定位
private fun dichotomyMethod(data: IntArray, key: Int) {
println("[二分法查找定位] 源数据:${data.toList()}")
var count = 0
var start = 0
var end = data.size - 1
var middle = 0
while (start < end) {
count ++
middle = (start + end) / 2
if (data[middle] < key) {
start = middle
} else if (data[middle] > key) {
end = middle
} else {
println("----> 查找次数: $count, 下标:$middle")
return
}
}
}
}
}
2. 运行结果
[遍历匹配查找定位法] 源数据:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
----> 查找次数: 6, 下标:5
[遍历匹配查找定位法] 源数据:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
----> 查找次数: 9, 下标:8
[二分法查找定位] 源数据:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
----> 查找次数: 3, 下标:5
[二分法查找定位] 源数据:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
----> 查找次数: 4, 下标:8
Process finished with exit code 0