, Array/ArraySlice . , , . , , , . , :
func bSearch<
S : Sliceable where S.SubSlice : Sliceable,
S.SubSlice.Generator.Element == S.Generator.Element,
S.SubSlice.SubSlice == S.SubSlice,
S.Generator.Element : Comparable,
S.Index : IntegerArithmeticType,
S.Index : IntegerLiteralConvertible,
S.SubSlice.Index == S.Index
>(el: S.Generator.Element, list: S) -> S.Generator.Element? {
if list.isEmpty { return nil }
let midInd = list.endIndex / 2
let midEl: S.Generator.Element = list[midInd]
if midEl == el {
return el
}
return midEl < el ?
bSearch(el, list: list[midInd+1..<list.endIndex]) :
bSearch(el, list: list[0..<midInd])
}
Swift 1.2 :
if isEmpty(list) { return nil }
let midInd = list.endIndex / 2
let midEl: S.Generator.Element = list[midInd]
if midEl == el {
return el
}
return midEl < el ?
bSearch(el, list[midInd+1..<list.endIndex]) :
bSearch(el, list[0..<midInd])