Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct FindMiddeleBetweenTwo<Point: Strideable> where Point.Stride: SignedInteger {
- let left: Point
- let right: Point
- func divide() -> Point {
- let distance = left.distance(to: right)
- let middle = distance / 2
- let outpoint = left.advanced(by: middle)
- return outpoint
- }
- }
- extension RandomAccessCollection where Index: Strideable, Index.Stride: SignedInteger, Element: Comparable {
- /// Binary Search in Ransom Access Collection
- /// - Returns: index of an element
- public func binarySearch(element: Element) -> Index? {
- var left: Index = startIndex
- var right: Index = index(before: endIndex)
- while left <= right {
- let finder = FindMiddeleBetweenTwo(left: left, right: right)
- let indexdivaded = finder.divide()
- let candidate = self[indexdivaded]
- if candidate < element {
- left = index(after: indexdivaded)
- } else if element < candidate {
- right = index(before: indexdivaded)
- } else {
- return indexdivaded
- }
- }
- return nil
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement