1.0二分查找算法Objective - C和swift

/*

二分查找(也稱折半查找)是很常見的一種在數組中查找數據的算法,作爲一名程序員是應該必須會的。它的基礎思想:獲取數組的中間值,將數組分割成兩份,利用中間值跟指定的值進行比較,如果中間值大於指定的值,就在數組的左邊進行查找;如果中間值小於指定值,就在數組的右邊進行查找。如此循環的執行下去,最終找到符合的值。

二分查找優點:

1.速度快   2.比較次數少    3.性能好

當然了,

缺點也很明顯:

1.必須是一個有序的數組(升序或者降序)

2.適用範圍:適用不經常變動的數組

*/

Objective-C代碼:

NSArray *arr = @[@(3),@(7),@(9),@(14),@(25),@(26),@(37),@(69)];

 NSLog(@"二分查找:%lu",[self binarySearch:arr target:37]);

target是目標值,即要找的值。

- (NSInteger)binarySearch:(NSArray *)array target:(NSInteger)target {
    if (!array.count) {
        return -1;//數組無元素,返回-1;
    }
    //數組起始元素下標
    NSInteger start = 0,end = array.count - 1;//數組最後元素的下標
    NSInteger mid = 0;
    //就剩兩個數的時候  start = end - 1;這個條件跳出
    while (start < end - 1) {
        //會有一些朋友看到有些人是( start + end ) / 2這樣寫的,但是這樣寫有一點不好,就是low+high會出現整數溢出的情況,如果存在溢出,你再除以2也是沒有用的,所以不能這麼寫
        mid = start + ((end - start)/2);
        
        //第mid項的內容
        NSInteger curNum = [array[mid] integerValue];
        if (curNum > target) {
            end = mid;
        } else {
            start = mid;
        }
    }
    if (target == [array[start] integerValue]) {
        return start;
    }
    if (target == [array[end] integerValue]) {
        return end;
    }
    
    return -1;
}

swift代碼:

let arr = [1,5,11,23,45,55,60,76,88,100];

print(self.binarySearch(array: arr, target: 100))

func binarySearch(array:[Int],target:Int) -> Int {
        if array.isEmpty {
            return -1
        }
        var start = 0
        var end = array.count - 1
        var mid = 0;
        while start < end - 1 {
            mid = start + ((end - start)/2);
            if target < array[mid] {
                end = mid
            } else {
                start = mid
            }
        }
        if (target == array[start]) {
            return start
        }
        if (target == array[end]) {
            return end
        }
        return -1
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章