冒泡排序(OC實現(xiàn))

冒泡排序(Bubble Sort),是一種計算機科學領域的較簡單的排序算法。
它重復地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從大到小、首字母從A到Z)錯誤就把他們交換過來。走訪元素的工作是重復地進行直到?jīng)]有相鄰元素需要交換,也就是說該元素已經(jīng)排序完成。
這個算法的名字由來是因為越大的元素會經(jīng)由交換慢慢“浮”到數(shù)列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“冒泡排序”。

算法原理

冒泡排序算法的原理如下:

  1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

  2. 對每一對相鄰元素做同樣的工作,從開始第一對到結(jié)尾的最后一對。在這一點,最后的元素應該會是最大的數(shù)。

  3. 針對所有的元素重復以上的步驟,除了最后一個。

  4. 持續(xù)每次對越來越少的元素重復上面的步驟,直到?jīng)]有任何一對數(shù)字需要比較。 [1]

冒泡排序流程圖


屏幕快照 2019-01-31 上午10.15.06.png

舉個??
拿到一個數(shù)組

NSMutableArray *result = [NSMutableArray arrayWithObjects:@3,@1,@4,@2,@5,nil]; 

執(zhí)行過程說明:
數(shù)組中一共有5個元素,我們拿第一個數(shù)字去和第二個數(shù)字比較,如果第一個數(shù)字比第二個數(shù)字大的話,那么第一個數(shù)字和第二個數(shù)字交換位置,如果相等的話 保持位置不變,如果第一個數(shù)小于第二個數(shù)字,那么保持當前位置不做交換。然后用第一個數(shù)字和第三個數(shù)字比較,以此類推,直到,第一個數(shù)字與幾個中所有元素比較完畢,那么就可以確定第一個數(shù)字的位置了。

那么由于數(shù)組中一共有五個元素,所以我們需要分別用這5個數(shù)字去執(zhí)行上述的步驟,也就是說需要循環(huán)5次。但是由于后面的元素越來越少(因為前面的元素已經(jīng)比較過了,一共只有5個,所以越來越少,持續(xù)每次對越來越少的元素(無序元素)重復上面的步驟,直到?jīng)]有任何一對數(shù)字需要比較,則序列最終有序。

了解完執(zhí)行過程,那么代碼很容易就可以理解了
錯誤代碼,這樣有很多重復的操作

這樣做也能起到排列的作用,但是有很多重復的操作。
 NSMutableArray *result = [NSMutableArray arrayWithObjects:@3,@1,@4,@2,@5,nil];
    for (int i = 0; i<result.count-1; i++) {//外層循環(huán)控制趟數(shù),總趟數(shù)為集合元素個數(shù)(result.count)
        //內(nèi)層循環(huán)為當前i趟數(shù),所需要比較的元素個數(shù)
            NSInteger left = [result[i] integerValue];
            NSInteger right = [result[i+1] integerValue];
            if (left>right) {
                [result exchangeObjectAtIndex:i withObjectAtIndex:i+1];
            }
    }
    NSLog(@"%@",result);

正確的代碼(使用內(nèi)層循環(huán)避免重復操作)
//內(nèi)層循環(huán)為當前i趟數(shù),所需要比較的元素個數(shù)(舉例如果當前需要比較的元素下標位置為2,那么這個數(shù)字為4,為什么數(shù)字為4呢?因為當i=0的時候,執(zhí)行一次排序后數(shù)組的排列變?yōu)锧1,@2,@4,@3,@5)所以第下標為2的數(shù)字為4,那么這時候,拿4去和下標為3的元素2,以及下標為4的數(shù)字5比較,所以內(nèi)層循環(huán)的次數(shù)應該為result.count-1-i(內(nèi)層循環(huán)的目的是為了避免去比較已經(jīng)比較循環(huán)過的數(shù)字,提升效率)

NSMutableArray *result = [NSMutableArray arrayWithObjects:@3,@1,@4,@2,@5,nil];
    for (int i = 0; i<result.count-1; i++) {//外層循環(huán)控制趟數(shù),總趟數(shù)為集合元素個數(shù)(result.count)
        for (int j = 0; j<result.count-1-i; j++) {
            NSInteger left = [result[j] integerValue];
            NSInteger right = [result[j+1] integerValue];
            if (left>right) {
                [result exchangeObjectAtIndex:j withObjectAtIndex:j+1];
            }
        }
    }
    NSLog(@"%@",result);
?著作權(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)容

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