iOSer你真的需要演算法麼?

3033發表於2017-12-14

###開篇 作為程式開發,真的需要演算法麼,這個問題確實一直來被討論,知乎,論壇,各個地方都交織著對他的討論,那麼作為一個iOS開發,我們到底需要演算法麼?個人感覺還是需要的。 ####為什麼我們要了解演算法 那麼為什麼我們需要了解演算法呢,下面先放一個個人覺得說的還不錯的觀點,從知乎上看到的一個回答。傳送門,的確我們可以自己做一個APP並讓他上線用不到多少的演算法知識,但是從長遠來看,如果勵志做一個技術人員,有良好的邏輯思維能力,單純的碼程式碼是不夠的,我們要做的不能知識簡單的造輪子,我們還需要去了解更多的東西,有時候對技術的追求才是我們前進的動力。 ####生活中的演算法 我們生活中還是一直籠罩著演算法的,從大學的資料結構到很久前的第一次用oc去寫一個氣泡排序,再到現在的幾乎面試必問的演算法知識(包括我們公司(一_一.)他彷彿始終圍繞著我們的程式生涯。今天我們就從最常見的氣泡排序開始吧。

  • 氣泡排序 在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。下面就上程式碼吧先來個C語言版
        int i, j, temp;
        
        int a[] = {1,3,9,8,2,4,5,7,6,0,11};
        
        int length = sizeof(a)/sizeof(a[0]);
        
        for (j = 0; j < length; j++)
        {
            for (i = 0; i < length - j - 1; i++)
            {
                if (a[i] > a[i + 1])
                {
                    temp = a[i];
                    
                    a[i] = a[i + 1];
                    
                    a[i + 1] = temp;
                }
            }
        }
        
        for (i = 0; i < length; i++)
        {
            printf("%d,", a[i]);
        } 
        printf("\n");
複製程式碼

然後看一波我們熟悉的OC版

  NSMutableArray *p = [[NSMutableArray alloc] initWithObjects:@"3",@"5",@"4",@"1",@"9",@"0",nil];

    for (int i = 0; i<p.count; i++)
    {
        for (int j=i+1; j<p.count; j++)
        {
            int a = [p[i] intValue];
            
            int b = [p[j] intValue];
           
            if (a > b)
            {
                [p replaceObjectAtIndex:i withObject:p[j]];
                
                [p replaceObjectAtIndex:j withObject:[NSString stringWithFormat:@"%d",a]];
            }
        }
    }
   
    NSLog(@"%@",p);
複製程式碼

出了這些之外,還有插入排序,選擇排序等多種排序方式,這裡我們就不做介紹了,下面開始今天介紹的重點,二叉樹。

####二叉樹 首先說起二叉樹先看一下的基本介紹吧。

  • 二叉樹的基本介紹

二叉樹_pptx.png
這就是一個簡單的二叉樹,他的度為3,滿二叉樹 2^k -1個子節點(滿二叉樹就是一定度上每個節點都有兩個子節點,上圖並不是滿二叉樹)。

  • 二叉樹的分類

二叉樹_pptx.png
#####二叉樹的遍歷 二叉樹的遍歷分為四種情況:先序遍歷,中序遍歷,後續遍歷,層次遍歷。

  • 先序遍歷

二叉樹_pptx.png
如上圖所示,如果我們要先序遍歷一個二叉樹,我們要記住的原則是:先訪問根結點,再左子樹,再右子樹。 所以我們遍歷得到的結果應該是:A,B,D,H,I,E,J,K,C,F,G。

  • 中序遍歷 面對同樣的二叉樹,如果我們選用不同的遍歷方式,得到的結果也會不同,同樣對上圖我們選擇中序遍歷,原則:中序是先訪問左子樹,再根結點,再右子樹 因此我們得到的結果是:H,D,I,B,J,E,K,A,F,C,G

  • 後續遍歷 後續遍歷的原則是:遍歷左(右)子樹,再後序遍歷右(左)子樹,最後訪問根 得到的結果:H,I,D,J,K,E,B,F,G,C,A

  • 層次遍歷 層次遍歷的原則是:從上到下從左到右 得到的結果:A,B,C,D,E,F,G,H,I,J,K

###後記 今天就說這麼多吧,如果以後有時間的話再寫一寫別的,所有的幸運都來自努力,iOS開發中還有太多需要學的,以上有說的不當的地方,歡迎指出。

相關文章