19.iOS算法基礎總結(jié)

網(wǎng)上搜羅了一些資料,整理了下算法的OC的實現(xiàn)代碼,雖然平時開發(fā)中一般用不到,但是多積累一些技術知識,還是對以后發(fā)展大有裨益的


image.png

1. 冒泡排序算法(Bubble Sort)

相鄰元素進行比較,按照升序或者降序,交換兩個相鄰元素的位置 是一種“穩(wěn)定排序算法”

1.2算法步驟:

比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結(jié)尾的最后一對。這步做完后,最后的元素會是最大的數(shù)。
針對所有的元素重復以上的步驟,除了最后一個。
持續(xù)每次對越來越少的元素重復上面的步驟,直到?jīng)]有任何一對數(shù)字需要比較。

1.3 動圖演示

4128398-dc0be5feca2a5e4e.gif

1.4 什么時候最快

當輸入的數(shù)據(jù)已經(jīng)是正序時。

1.5 什么時候最慢

當輸入的數(shù)據(jù)是反序時。

1.6 冒泡排序代碼示例

- (void)bubbleSortWithArray:(NSMutableArray *)array {
    for (int i = 0; i < array.count - 1; i++) {
         //外層for循環(huán)控制循環(huán)次數(shù)
        for (int j = 0; j < array.count - 1 - i; j++) {
            //內(nèi)層for循環(huán)控制交換次數(shù)
            if ([array[j] integerValue] > [array[j + 1] integerValue]) {
                [array exchangeObjectAtIndex:j withObjectAtIndex:j + 1];
            }
        }
    }
    NSLog(@"%@",array);
}

[self bubbleSortWithArray:[@[@"1",@"7",@"3",@"5"] mutableCopy]];

2. 快速排序算法(quick sort)

快速排序(Quick Sort) 的基本思想是:

通過一趟排序?qū)⒋判虻挠涗浄指畛瑟毩⒌膬刹糠?,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則可分別對這兩部分記錄繼續(xù)進行排序,以達到整個序列有序的目的。

排序思路:

數(shù)組選第一個數(shù),把比數(shù)小的放到數(shù)的左邊,比數(shù)大的放到右邊,結(jié)束后對左右兩邊的數(shù)組作重復處理即可。
快速排序使用分治法(Divide and conquer)策略來把一個串行(list)分為兩個子串行(sub-lists)。

2.2 算法步驟
從數(shù)列中挑出一個元素,稱為 “基準”(pivot);
重新排序數(shù)列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的后面(相同的數(shù)可以到任一邊)。在這個分區(qū)退出之后,該基準就處于數(shù)列的中間位置。這個稱為分區(qū)(partition)操作;
遞歸地(recursive)把小于基準值元素的子數(shù)列和大于基準值元素的子數(shù)列排序;
遞歸的最底部情形,是數(shù)列的大小是零或一,也就是永遠都已經(jīng)被排序好了。雖然一直遞歸下去,但是這個算法總會退出,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最后的位置去。

2.3 動圖演示


4128398-b58b2e66fc788a9c.gif

2.4 快速排序代碼示例

- (void)quickSortArray:(NSMutableArray *)array withLeftIndex:(NSInteger)leftIndex andRightIndex:(NSInteger)rightIndex
{
    if (leftIndex >= rightIndex) {//如果數(shù)組長度為0或1時返回
        return ;
    }
    
    NSInteger i = leftIndex;
    NSInteger j = rightIndex;
    //記錄比較基準數(shù)
    NSInteger key = [array[i] integerValue];
    
    while (i < j) {
        /**** 首先從右邊j開始查找比基準數(shù)小的值 ***/
        while (i < j && [array[j] integerValue] >= key) {//如果比基準數(shù)大,繼續(xù)查找
            j--;
        }
        //如果比基準數(shù)小,則將查找到的小值調(diào)換到i的位置
        array[i] = array[j];
        
        /**** 當在右邊查找到一個比基準數(shù)小的值時,就從i開始往后找比基準數(shù)大的值 ***/
        while (i < j && [array[i] integerValue] <= key) {//如果比基準數(shù)小,繼續(xù)查找
            i++;
        }
        //如果比基準數(shù)大,則將查找到的大值調(diào)換到j的位置
        array[j] = array[i];
        
    }
    
    //將基準數(shù)放到正確位置
    array[i] = @(key);
    
    /**** 遞歸排序 ***/
    //排序基準數(shù)左邊的
    [self quickSortArray:array withLeftIndex:leftIndex andRightIndex:i - 1];
    //排序基準數(shù)右邊的
    [self quickSortArray:array withLeftIndex:i + 1 andRightIndex:rightIndex];
}

NSMutableArray * arr = @[@16,@1,@2,@9,@7,@12,@5,@3,@8,@13,@10].mutableCopy;
[self quickSortArray:arr withLeftIndex:0 andRightIndex:arr.count-1];
NSLog(@"%@",array);

二叉樹的遍歷

1、前序遍歷: 規(guī)則是若二叉樹為空,則空操作返回,否則先訪問根節(jié)點,在前序遍歷左子樹,再前序遍歷右子樹。 (輸出、左重新遞歸、右重新遞歸)

2、中序遍歷: 規(guī)則是若樹為空,則空操作返回,否則從根節(jié)點開始(注意并不是先訪問哪根節(jié)點),中序遍歷根節(jié)點的左子樹,然后訪問根節(jié)點,最后中序遍歷右子樹。 (左重新遞歸、輸出、右重新遞歸)

3、后序遍歷:規(guī)則是若樹為空,則空操作返回,否則從左到右先葉子后結(jié)點的方式遍歷訪問左右子樹,最后是訪問根節(jié)點。

4、層序遍歷:規(guī)則是若樹為空,則空操作返回,否則從樹的第一層,也就是根節(jié)點開始訪問,從上而下逐層遍歷,在同一層中,按從左到右的順序?qū)Y(jié)點逐一訪問。

算法四:二分查找算法

二分查找算法是一種在有序數(shù)組中查找某一特定元素的搜索算法。搜素過程從數(shù)組的中間元素開始,如果中間元素正好是要查找的元素,則搜素過程結(jié)束;如果某一特定元素大于或者小于中間元素,則在數(shù)組大于或小于中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。如果在某一步驟數(shù)組為空,則代表找不到。這種搜索算法每一次比較都使搜索范圍縮小一半。折半搜索每次把搜索區(qū)域減少一半,時間復雜度為Ο(logn)。

使用二分法好處:可以加快尋找的效率。

二分法的思路: 它是通過與數(shù)組的中間值進行比較的

步驟如下:

1.我們要查找的值為X

2.數(shù)組是從小到大排序的

**

1.先取出數(shù)組中間的元素

2.把中間元素和X進行比較,如果中間元素大于X,那么X就位于第一個元素,和中間元素之間。反之,如果中間元素小于X,那么X就位于中間元素和最大值之間。

3.這樣進行比較之后,我們的查找范圍就小了一半。

    NSArray *arr = @[@1,@20,@30,@45,@50,@55,@60,@66,@70];
    NSInteger x = 70,min,max,mid;
    min = 0;
    max = arr.count - 1;
    mid = (min + max) / 2;
    for (int i = 0; i < arr.count; i++){
        if ([arr[mid] integerValue] == x){
            NSLog(@"查找次數(shù)為--->%d次",i);
            NSLog(@"尋找值位置為--->%ld",mid);
            return;
        }
        else if ([arr[mid] integerValue] > x){
            max = mid - 1;
            mid = (min + max) / 2;
        }
        else if ([arr[mid] integerValue] < x){
            min = mid + 1;
            mid = (min + max) / 2;
        }

iOS開發(fā)幾大算法資料整理

iOS 算法~十大算法基礎總結(jié)

iOS算法總結(jié)-快速排序

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 用到的組件 1、通過CocoaPods安裝 2、第三方類庫安裝 3、第三方服務 友盟社會化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 15,211評論 1 180
  • 有人給前臺的美眉介紹了一位在銀行做信貸的男士,剛剛她跟我聊起來說:唉,看他朋友圈會打麻將不知道賭的厲不厲害呢,而且...
    花和尚929閱讀 324評論 0 0
  • Audi entl?sst Topmanager 奧迪解雇高層管理 Vier von insgesamt sieb...
    冷秋山閱讀 376評論 0 1
  • 笑話送給朋友,祝您每天開心快樂! 1.一廠長喝多回家錯進豬圈,躺在母豬身邊說:老婆:給我倒杯水,母豬哼了一哼,村長...
  • 最近在網(wǎng)絡上特別流行這樣的一句話,漂亮的皮囊千篇一律,而有趣的靈魂千里挑一。 靈魂永遠在皮囊之上,在我看來一直都是...
    悠爺閱讀 666評論 1 0

友情鏈接更多精彩內(nèi)容