二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
    它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是:(这里假设数组元素呈升序排列)将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止;如 果xa[n/2],则我们只要在[数组](https://baike.baidu.com/item/%E6%95%B0%E7%BB%84)a的左半部继续搜索x;如果xa[n/2],则我们只要在数组a的右 半部继续搜索x。

    有序查找时间复杂度为O(n) 二分查找时间复杂度为O(log n)
    swift示例代码:

    1. func testBinary(){
    2. var pArr:[Person] = []
    3. for i in 0..<10 {
    4. let p = Person.init(age: i*2+1)
    5. pArr.append(p)
    6. }
    7. let index = binarySearch(pArr, key: Person.init(age: 13))
    8. print("index===\(index ?? -1)")
    9. }
    10. ///二分查找
    11. func binarySearch<T: Comparable>(_ a: [T], key: T) -> Int? {
    12. ///左序号
    13. var lowerBound = 0
    14. ///右序号
    15. var upperBound = a.count
    16. ///执行逻辑
    17. while lowerBound < upperBound {
    18. ///1.计算中间序号 --> n/2
    19. ///2.取中间序号对应的值 与需要查找的key做比较
    20. let midIndex = lowerBound + upperBound / 2
    21. if a[midIndex] == key {
    22. /// 相等则返回对应的序号
    23. return midIndex
    24. } else if a[midIndex] < key {
    25. ///如果middle的值 小于key 则说明key在middle的右边
    26. ///改变左序号---->从而改变了下次middle对应的序号
    27. lowerBound = midIndex + 1
    28. } else {
    29. ///如果middle的值 大于key 则说明key在middle的左边
    30. ///改变右序号---->从而改变了下次middle对应的序号
    31. upperBound = midIndex - 1
    32. }
    33. }
    34. return nil
    35. }
    36. ///有序查找
    37. func sequenceSearch<T: Comparable>(_ a: [T], key: T) -> Int? {
    38. for i in 0..<a.count {
    39. if a[i] == key {
    40. return i
    41. }
    42. }
    43. return nil
    44. }
    45. class Person:Comparable{
    46. static func < (lhs: Person, rhs: Person) -> Bool {
    47. return lhs.age < rhs.age
    48. }
    49. static func == (lhs: Person, rhs: Person) -> Bool {
    50. return lhs.age == rhs.age
    51. }
    52. static func > (lhs: Person, rhs: Person) -> Bool {
    53. return lhs.age > rhs.age
    54. }
    55. var age:Int = 0
    56. init(age:Int){
    57. self.age = age
    58. }
    59. }