Skip to content

Instantly share code, notes, and snippets.

@9bany
Created November 12, 2021 14:57
Show Gist options
  • Save 9bany/c4ebed33ca0c40a2290c2a16a5860d62 to your computer and use it in GitHub Desktop.
Save 9bany/c4ebed33ca0c40a2290c2a16a5860d62 to your computer and use it in GitHub Desktop.
Binary search object - Swift
// recursive
func binarySearch<T>(key: Int, arr: [T], range: Range<Int>? = nil, _ callBack: (T) -> Int) -> Int? {
var rangeDefault: Range<Int>
if let r = range {
rangeDefault = r
} else {
rangeDefault = 0..<arr.count
}
if rangeDefault.lowerBound >= rangeDefault.upperBound {
return nil
}
let indexMid = rangeDefault.lowerBound + (rangeDefault.upperBound - rangeDefault.lowerBound) / 2
let object = callBack(arr[indexMid])
if object < key {
return binarySearch(key: key,
arr: arr,
range: (indexMid + 1)..<rangeDefault.upperBound,
callBack)
} else if object > key {
return binarySearch(key: key,
arr: arr,
range: rangeDefault.lowerBound..<indexMid,
callBack)
} else {
return indexMid
}
}
@9bany
Copy link
Author

9bany commented Nov 12, 2021

How to use ?

class A {
  var id: Int
  init(_ id: Int) {
    self.id = id
  }
}
let arr = [
  A.init(0),
  A.init(1),
  A.init(2),
  A.init(3),
  A.init(4),
  A.init(5),
  A.init(6),
]

if let result = binarySearch(key: 6, arr: arr, { item in return item.id}) {
  print(arr[result].id) // 6
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment