iOS 希爾排序

??希爾排序(Shell Sort)又稱遞減增量排序,本質(zhì)上是插入排序,可以把序列看成一個矩陣,按照步長分成步長m列,逐列進(jìn)行排序。m按照步長隊(duì)列依次減小,直至步長為1。
??希爾排序按步長排序一次可以有效減少一些逆序?qū)ΑO柋救私o出的步長數(shù)組為n/(2^k)。比如n = 15 時,步長序列為[8 ,4 , 2 , 1]

第一步:構(gòu)建步長隊(duì)列

- (void)creatStepQueue
{
    [self.stepQueue removeAllObjects];
    NSInteger count = self.sortArray.count;
    while ((count /= 2) > 0) {
        [self.stepQueue addObject:@(count)];
    }
    NSLog(@"stepArray = %@",self.stepQueue);
}

第二步:根據(jù)每次的步長對每列數(shù)組排序

- (void)sortByStep:(NSInteger)step
{
    if (step <= 0) {
        return;
    }
    for (NSInteger col = 0; col < step; col++) { // 劃分插入排序的數(shù)組
        
        // 對新數(shù)組插入排序
        for (NSInteger begain = col + step; begain < self.sortArray.count; begain += step) { // 遍歷新數(shù)組
            NSInteger currtent = begain;
            while (currtent > col && [self compareObjcet:self.sortArray[currtent] anotherObject:self.sortArray[currtent - step]]) {
                [self swapObjectWithIndex:currtent anotherIndex:currtent - step];
                currtent -= step;
            }
            
        }
    }
}

那么整體的排序過程

- (void)sort
{
    [self creatStepQueue];
    
    for (NSNumber *step in self.stepQueue) {
        [self sortByStep:[step integerValue]];
    }
}

優(yōu)化點(diǎn):隨著算法的發(fā)展,科學(xué)家發(fā)現(xiàn)了一種更加好的步長隊(duì)列,可以進(jìn)一步優(yōu)化希爾排序的排序速度。[1,5,19,41,109....]

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

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

  • 序言 以下內(nèi)容摘自百度百科 希爾排序 希爾排序(Shell's Sort)是插入排序的一種又稱“縮小增量排序”(D...
    路飛_Luck閱讀 608評論 0 2
  • Demo_github 希爾排序 希爾排序(Shell Sort)又稱為縮小增量排序,它是一種插入排序。它是直接插...
    SkyMing一C閱讀 1,002評論 0 1
  • 一些概念 數(shù)據(jù)結(jié)構(gòu)就是研究數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)以及它們之間相互關(guān)系,并對這種結(jié)構(gòu)定義相應(yīng)的運(yùn)算,而且確保經(jīng)過這...
    Winterfell_Z閱讀 6,601評論 0 13
  • 穩(wěn)定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;不穩(wěn)定:如果a原本在b的前面,而a=b,排序之后a可...
    意識流丶閱讀 3,303評論 2 9
  • 我和兒子今天下午都休息,下午和幾個同學(xué)的媽媽聊了聊,關(guān)于暑假補(bǔ)課,關(guān)于暑假補(bǔ)英語補(bǔ)體育的事,晚上我在親子通讀群里讀...
    志郁閱讀 327評論 2 7

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