Advertisement
SEEEEEAAAAAA10000000

Binary Search in Random Access Collections

Jun 23rd, 2019
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 1.19 KB | None | 0 0
  1. struct FindMiddeleBetweenTwo<Point: Strideable> where Point.Stride: SignedInteger {
  2.     let left: Point
  3.     let right: Point
  4.     func divide() -> Point {
  5.         let distance = left.distance(to: right)
  6.         let middle = distance / 2
  7.         let outpoint = left.advanced(by: middle)
  8.         return outpoint
  9.     }
  10. }
  11.  
  12. extension RandomAccessCollection where Index: Strideable, Index.Stride: SignedInteger, Element: Comparable {
  13.    
  14.     /// Binary Search in Ransom Access Collection
  15.     /// - Returns: index of an element
  16.    
  17.     public func binarySearch(element: Element) -> Index? {
  18.        
  19.         var left: Index = startIndex
  20.         var right: Index = index(before: endIndex)
  21.        
  22.         while left <= right {
  23.             let finder = FindMiddeleBetweenTwo(left: left, right: right)
  24.             let indexdivaded = finder.divide()
  25.             let candidate = self[indexdivaded]
  26.             if candidate < element {
  27.                 left = index(after: indexdivaded)
  28.             } else if element < candidate {
  29.                 right = index(before: indexdivaded)
  30.             } else {
  31.                 return indexdivaded
  32.             }
  33.         }
  34.        
  35.         return nil
  36.     }
  37. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement