IOS常見算法排序(冒泡,快速,兩個有序數(shù)組合并等)

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

/**
 冒泡排序?qū)崿F(xiàn)

 @param dataArray 需要排序的數(shù)組
 @return 排序完成的數(shù)組
 */
- (NSArray *)buddleSort:(NSArray <NSNumber *> *)dataArray{
    
    NSMutableArray <NSNumber *> * resultArray = [NSMutableArray arrayWithArray:dataArray];
    
    for (int i = 0; i < [dataArray count] - 1; i ++) {

        for (int j = 0; j < [dataArray count] - 1 - i; j ++) {
            
            if (resultArray[j].integerValue > resultArray[j + 1].integerValue) {
                
                [resultArray exchangeObjectAtIndex:j withObjectAtIndex:j + 1];
                
            }
        }
    }
    
    return resultArray;
}

快速排序的實現(xiàn)

/**
 快速排序

 @param dataArray 需要排序的數(shù)組
 @param leftIndex 左邊的index
 @param rightIndex 右邊的index
 */
- (void)quickSort:(NSMutableArray *)dataArray leftIndex:(NSInteger)leftIndex rightIndex:(NSInteger)rightIndex{
    
    if (leftIndex >= rightIndex) {
        return;
    }
    
    NSInteger i = leftIndex;
    NSInteger j = rightIndex;
    NSInteger key = [dataArray[i] integerValue];
    
    while (i != j) {
        
        //先從右邊找
        while (i < j && [dataArray[j] integerValue] >= key) {
            j --;
        }
        
        //再從左邊找
        while (i < j && [dataArray[i] integerValue] <= key) {
            i ++;
        }
        
        if (i < j) {
            [dataArray exchangeObjectAtIndex:i withObjectAtIndex:j];
        }
    }
    
    [dataArray exchangeObjectAtIndex:leftIndex withObjectAtIndex:j];
    //遞歸剩下的左邊和右邊
    [self quickSort:dataArray leftIndex:leftIndex rightIndex:i - 1];
    [self quickSort:dataArray leftIndex:i + 1 rightIndex:rightIndex];
    
}

兩個有序數(shù)組合并成一個有序數(shù)組的實現(xiàn)(插入排序)

/**
 兩個有序數(shù)組合并

 @param firstArray 第一個數(shù)組
 @param secondArray 第二個數(shù)組
 @return 合并的數(shù)組
 */
- (NSArray *)insertSort:(NSArray *)firstArray secondArray:(NSArray *)secondArray{
    
    NSMutableArray * resuleArray = [NSMutableArray arrayWithCapacity:[firstArray count] + [secondArray count]];
    
    NSInteger i = 0;
    NSInteger j = 0;
    
    while (i < [firstArray count] && j < [secondArray count] ) {
        
        if (firstArray[i] <= secondArray[j]) {
            resuleArray[i + j] = firstArray[i ++];
        }else{
            resuleArray[i + j] = secondArray[j ++];
        }
    }
    
    //保證數(shù)組剩余的部分加入合并后的數(shù)組中
    while (i < [firstArray count]) {
        resuleArray[i + j] = firstArray[i ++];
    }
    
    while (j < [secondArray count]) {
        resuleArray[i + j] = secondArray[j ++];
    }
    
    
    return resuleArray;
}

持續(xù)更新中... 有不對的地方歡迎指正 ??

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

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,720評論 25 709
  • 總結(jié)一下常見的排序算法。 排序分內(nèi)排序和外排序。內(nèi)排序:指在排序期間數(shù)據(jù)對象全部存放在內(nèi)存的排序。外排序:指在排序...
    jiangliang閱讀 1,514評論 0 1
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,297評論 0 52
  • 曾幾何時那個雙十一堪比兒時過年,因為要熬夜,還挺興奮。望眼欲穿的消費狂潮讓人失去理性,好似人被浩劫過,啥啥都缺,啥...
    好馨勤閱讀 133評論 0 0
  • 心靜不下來 是因為思念你。 回憶昨夜 圓月,亮星,白云。 一輪圓月 是你為遠(yuǎn)行的我點亮的燈盞, 讓黑暗中行走的我有...
    漂流蘋閱讀 314評論 0 0

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