前言
二分查找在程序開發過程中是十分常見的算法,也是在程序員面試過程中關於算法的知識點考察過程中最常問的知識點;二分查找在實際開發過程中也常常用的到;就比如在一個一維有序數組中查找最大的一個數;我們可以每次都和數組中間的元素對比,然後縮小查找範圍。
二分查找是一個非常快速高效的查找算法,因爲每次查找數據查找空間都會被縮小爲原理數組長度的一半,直到查找空間爲空,才結束查找。
但是二分查找針對的是有序數組,而且是那種不經常變動數組;還有就是要是數據的數據量比較小,也不是適合用二分查找,畢竟遍歷一次就夠了,相對於去處理數據量比較大的數組時,二分查找的優勢就比較明顯了!
代碼
這裏我放上OC、Swift和Python的二分查找的代碼,以便大家學習交流。
OC
- (NSInteger)halveSearch:(NSArray *)array target:(id)target{
if(array.count == 0){
return -1;
}
//標記區間的開始小標
NSInteger start = 0;
//標記區間結束的下標
NSInteger end = array.count - 1;
//標記區間中間的下標
NSInteger middle = 0;
while (start < end - 1) {
//取區間數組裏面的中間下標
middle = start + (end - start) / 2;
//中間值大於目標值
if([array[middle] integerValue] > [target integerValue]){
//目標值在中間值前面,將中間值賦給end作爲最後一個值,在前面進行搜索取值
end = middle;
}else{
//中間值小於目標值
//將中間值賦給start作爲開始值,在後面一段進行搜索
start = middle;
}
//如果起始值等於目標值
if ([array[start] integerValue] == [target integerValue]) {
return start;
}
//如果結束值等於目標值
if ([array[end] integerValue] == [target integerValue]) {
return end;
}
}
return -1;
}
Swift
func halveSearch(_ array: Array<Any>, target: NSInteger) -> NSInteger {
if array.count == 0{
return -1
}
//標記區間的開始小標
var start = 0
//標記區間結束的下標
var end = array.count - 1
//標記區間中間的下標
var middle = 0
while start < end - 1 {
//取區間數組裏面的中間下標
middle = start + (end - start) / 2
//中間值大於目標值
if (array[middle] as AnyObject).integerValue > target{
//目標值在中間值前面,將中間值賦給end作爲最後一個值,在前面進行搜索取值
end = middle
}else{
//中間值小於目標值
//將中間值賦給start作爲開始值,在後面一段進行搜索
start = middle
}
//如果起始值等於目標值
if (array[start] as AnyObject).integerValue == target{
return start
}
//如果結束值等於目標值
if (array[end] as AnyObject).integerValue == target{
return end
}
}
return -1
}
Python
def halveSearch(array, target):
if len(array) == 0:
return -1
# 標記區間的開始小標
start = 0
# 標記區間結束的下標
end = len(array) - 1
# 標記區間中間的下標
middle = 0
while start < end - 1:
# 取區間數組裏面的中間下標
middle = int(start + (end - start) / 2)
# 中間值大於目標值
if array[middle] > target:
# 目標值在中間值前面,將中間值賦給end作爲最後一個值,在前面進行搜索取值
end = middle
else:
# 中間值小於目標值
# 將中間值賦給start作爲開始值,在後面一段進行搜索
start = middle
# 如果起始值等於目標值
if array[start] == target:
return start
# 如果結束值等於目標值
if array[end] == target:
return end
return -1
結束語
歡迎各位大神提出寶貴的意見和建議,也歡迎大家進羣交流365152048!
CSDN博客 | https://zfj1128.blog.csdn.net |
---|---|
GITEE主頁 | https://gitee.com/zfj1128 |
GITHUB主頁 | https://github.com/zfjsyqk |