一、原理
1.二分法查找的前提是要先将数组进行排序
2.二分法查找是将数组逐次分成两个数组,然后再在分好的两个数组当中的一个进行继续分数组查找的一个过程,所以二分法查找只会查找数组当中的一部分。
3.比较。如果要查找的元素大于数组分割的中间元素,那么查找就在后面的大的数组中进行,如果要查找的元素小于数组的分割的中间元素,那么查找就在前面的小数组中进行,当然如果正好等于的话那么查找就结束了。
4.话不多说,直接上代码
func binarySearch(array: [Int], target: Int) -> Int {
var left = 0
var right = array.count - 1
while (left <= right) {
let mid = (left + right) / 2
let value = array[mid]
if (value == target) {
return mid
}
if (value < target) {
left = mid + 1
}
if (value > target) {
right = mid - 1
}
}
return -1
}
5.上面的这种写法只适用于整型数组,我们是要查找所有可以进行比较的元素类型,所以这里要用到泛型
func binarySearch(array: [T], target: T) -> Int {
var left = 0
var right = array.count - 1
while (left <= right) {
let mid = (left + right) / 2
let value = array[mid]
if (value == target) {
return mid
}
if (value < target) {
left = mid + 1
}
if (value > target) {
right = mid - 1
}
}
return -1
}
6.当然也还有一些其他的扩展,比如你想在字符串数组中查找以某串字符开头的元素也是可以的
func binarySearchPrefix(array: [String], target: String) -> Int {
var left = 0
var right = array.count - 1
while (left <= right) {
let mid = (left + right) / 2
let value = array[mid]
if (value.hasPrefix(target)) {
return mid
}
if (value < target) {
left = mid + 1
}
if (value > target) {
right = mid - 1
}
}
return -1
}
到此,二分法基本上也就差不多了