快速排序算法_Objective-C

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序?qū)⒁判虻臄?shù)據(jù)以設(shè)定的樞紐位置為基準(zhǔn)逼肯,分割成獨立的兩部分胎围,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小留攒,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序坚洽,整個排序過程可以遞歸進(jìn)行,以此達(dá)到整個數(shù)據(jù)變成有序序列笛质。

快速排序是對冒泡排序的優(yōu)化泉沾,要比冒泡排序的效率高出幾個數(shù)量級。

10000個隨機數(shù)的排序.png
20000個隨機數(shù)的排序.png

之所以沒打印10萬級的排序?qū)Ρ仁且驗槊芭菖判驎r間太久了妇押,但是可以看一下快速排序的計算時間跷究。
100000個隨機數(shù)的計算時間是 \ 0.129158秒
1000000個隨機數(shù)的計算時間是 \ 1.429434秒

差距大的原因很明顯,冒泡排序做了很多無用功的數(shù)值比較敲霍,打印出來看一下就知道了俊马。

10000個隨機數(shù)的計算比較次數(shù).png

可以看到10000個隨機數(shù)的比較冒泡排序比快速排序多了49873225次的無用比較丁存,差距太懸殊了。

冒泡排序大家都很熟了


NSMutableArray *snums = [NSMutableArray array];
    for (int i = 0; i< 10000; i++) {
        NSInteger num = arc4random()%10000000;
        [snums addObject:@(num)];
    }
    
    // 冒泡排序升序
    for (int i = 0; i < snums.count -1; i++) {
        
        for (int j=i+1; j < snums.count; j++) {
            if ([snums[i] integerValue] > [snums[j] integerValue]) {
                [snums exchangeObjectAtIndex:i withObjectAtIndex:j];
            }
        }
    }

  // 冒泡排序降序
    for (int i = 0; i < snums.count -1; i++) {
        
        for (int j=i+1; j < snums.count; j++) {
            if ([snums[i] integerValue] < [snums[j] integerValue]) {
                [snums exchangeObjectAtIndex:i withObjectAtIndex:j];
            }
        }
    }
  • 快速排序的思路

1 . 設(shè)置兩個變量i柴我,j解寝,排序開始時i = 0j = mutableArray.count - 1艘儒;
2 . 設(shè)置數(shù)組的第一個值為比較基準(zhǔn)數(shù)也叫樞紐key聋伦,key = mutableArray.count[0];
3 . 因為設(shè)置key為數(shù)組的第一個元素界睁,所以先從數(shù)組最右邊開始往前查找比key小的值觉增。如果沒有找到,執(zhí)行j-- 然后繼續(xù)往前搜索翻斟;如果找到則將mutableArray[j]的值賦給mutableArray[i]逾礁,并且停止往前搜索,進(jìn)入第4步杨赤;
4 . 從i位置開始往后搜索比key大的值敞斋,如果沒有找到截汪,執(zhí)行i++繼續(xù)往后搜索疾牲;如果找到則將mutableArray[i]的值賦給mutableArray[j],并且停止往后搜索衙解;
5 . 將key值賦給mutableArray[i];
6 . 以i為分界線分別對兩側(cè)的數(shù)遞歸執(zhí)行上述步驟阳柔,直到i == j停止排序。

舉例:

待排序數(shù)組是[2,5,4,1,3];那么key=2蚓峦,這個時候我們可以理解為數(shù)組的第一個位置騰出一個坑舌剂,成了[(),5,4,1,3],而2由key先代為保管,i=0j=4暑椰;

這個時候我們進(jìn)行上述步驟的第3步霍转,key=2 依次比較后1<2,所以1就填到了2的坑上成了[1,5,4,(1),3],因為1賦值給了2那個位置一汽,這時j=3避消,i=0

這個時候我們進(jìn)行上述步驟的第4步召夹,key=2 依次比較后 5>2,所以5就填到了1最開始的位置岩喷,數(shù)組變成了[1,(5),4,5,3],因為5賦值給了原來1的位置,這時i=1监憎,j=3纱意;

那么接下來也就是第5步了,原來5的位置由我們拿出來的key=2 來填上鲸阔,數(shù)組變成了[1,2,4,5,3]偷霉,然后把數(shù)組從i的位置分成兩部分index范圍[0,1],和[1,4]兩部分迄委,然后繼續(xù)遞歸執(zhí)行上述步驟。

通過對數(shù)組不斷的拆分比較最終完成排序腾它。

- (void)quiklookAlgorithm{
    NSMutableArray *mnums = [NSMutableArray array];
    for (int i = 0; i< 10000; i++) {
        NSInteger num = arc4random()%10000000;
        [mnums addObject:@(num)];
    }

    NSDate *start = [NSDate date];
    
    [self quiklookSortWithArray:mnums withLeftIndex:0 withRightIndex:mnums.count-1];
    
    NSDate *end = [NSDate date];
    NSTimeInterval timeInterval = [end timeIntervalSinceDate:start];
    
    NSLog(@"%ld個數(shù)的快速排序計算時間:%f秒    進(jìn)行計算的比較次數(shù)%ld",mnums.count,timeInterval,_pNum);
}

- (void)quiklookSortWithArray:(NSMutableArray *)mArray
                withLeftIndex:(NSInteger)leftIndex
               withRightIndex:(NSInteger)rightIndex{
    if (leftIndex >= rightIndex) {
        return;
    }
    
    // 基準(zhǔn)數(shù)
    NSInteger i = leftIndex;
    NSInteger j = rightIndex;
    // 把key刨出來
    NSInteger key = [mArray[i] integerValue];
    
//    // 降序排列
//    while (i < j) {
//        // 從右邊j開始查找比基準(zhǔn)數(shù)小的值
//        while (i<j && [mArray[j] integerValue] <= key) {
//            j--;
//        }
//        // 如果比基準(zhǔn)數(shù)小
//        mArray[i] = mArray[j];
//
//        // 從左邊i開始查找比基準(zhǔn)數(shù)大的值
//        while (i<j && [mArray[i] integerValue] >= key) {
//            i++;
//        }
//        // 如果比基準(zhǔn)數(shù)大
//        mArray[j] = mArray[i];
//    }
    
    // 升序排列
    while (i < j) {
        // 從右邊j開始查找比基準(zhǔn)數(shù)小的值
        while (i<j && [mArray[j] integerValue] >= key) {
            j--;
            _pNum += 1;
        }
        // 如果比基準(zhǔn)數(shù)小
        mArray[i] = mArray[j];
        
        // 從左邊i開始查找比基準(zhǔn)數(shù)大的值
        while (i<j && [mArray[i] integerValue] <= key) {
            i++;
            _pNum += 1;
        }
        // 如果比基準(zhǔn)數(shù)大
        mArray[j] = mArray[i];
    }
    
    // 把key填回坑里
    mArray[i] = @(key);
    
    /** 遞歸排序 **/
    
    [self quiklookSortWithArray:mArray withLeftIndex:leftIndex withRightIndex:i-1];
    

    [self quiklookSortWithArray:mArray withLeftIndex:i+1 withRightIndex:rightIndex];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末跑筝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瞒滴,更是在濱河造成了極大的恐慌曲梗,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妓忍,死亡現(xiàn)場離奇詭異虏两,居然都是意外死亡,警方通過查閱死者的電腦和手機世剖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門定罢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人旁瘫,你說我怎么就攤上這事祖凫。” “怎么了酬凳?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵惠况,是天一觀的道長。 經(jīng)常有香客問我宁仔,道長稠屠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任翎苫,我火速辦了婚禮权埠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘煎谍。我一直安慰自己攘蔽,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布呐粘。 她就那樣靜靜地躺著满俗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪事哭。 梳的紋絲不亂的頭發(fā)上漫雷,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音鳍咱,去河邊找鬼降盹。 笑死,一個胖子當(dāng)著我的面吹牛谤辜,可吹牛的內(nèi)容都是我干的蓄坏。 我是一名探鬼主播价捧,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涡戳!你這毒婦竟也來了结蟋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤渔彰,失蹤者是張志新(化名)和其女友劉穎嵌屎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恍涂,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡宝惰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了再沧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尼夺。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖炒瘸,靈堂內(nèi)的尸體忽然破棺而出淤堵,到底是詐尸還是另有隱情,我是刑警寧澤顷扩,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布拐邪,位于F島的核電站,受9級特大地震影響屎即,放射性物質(zhì)發(fā)生泄漏庙睡。R本人自食惡果不足惜事富,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一技俐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧统台,春花似錦雕擂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贵扰,卻和暖如春仇穗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背戚绕。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工纹坐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舞丛。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓耘子,卻偏偏與公主長得像果漾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谷誓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 概述 排序有內(nèi)部排序和外部排序绒障,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大捍歪,一次不能容納全部...
    蟻前閱讀 5,164評論 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,239評論 0 2
  • 一等獎:免費冰島自駕之旅名額 1名 價值:6830元 詳情:五天四夜 Day.1 Day.2 Day.3 Day....
    小蕈閱讀 204評論 0 1
  • 我喜歡隔著窗戶 看風(fēng)吹起發(fā)梢 看你打打鬧鬧 看你淺淺微笑 我喜歡隔著窗戶 聞著飄來發(fā)香 捂著臉龐發(fā)燙 數(shù)著心跳幾秒...
    舊舊的燈閱讀 202評論 0 1