iOS 希尔排序

  希尔排序(Shell Sort)又称递减增量排序,本质上是插入排序,可以把序列看成一个矩阵,按照步长分成步长m列,逐列进行排序。m按照步长队列依次减小,直至步长为1。
  希尔排序按步长排序一次可以有效减少一些逆序对。希尔本人给出的步长数组为n/(2^k)。比如n = 15 时,步长序列为[8 ,4 , 2 , 1]

第一步:构建步长队列

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

第二步:根据每次的步长对每列数组排序

- (void)sortByStep:(NSInteger)step
{
    if (step <= 0) {
        return;
    }
    for (NSInteger col = 0; col < step; col++) { // 划分插入排序的数组
        
        // 对新数组插入排序
        for (NSInteger begain = col + step; begain < self.sortArray.count; begain += step) { // 遍历新数组
            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]];
    }
}

优化点:随着算法的发展,科学家发现了一种更加好的步长队列,可以进一步优化希尔排序的排序速度。[1,5,19,41,109....]

希尔排序的最佳步长队列的数学表达式
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 序言 以下内容摘自百度百科 希尔排序 希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(D...
    路飞_Luck阅读 608评论 0 2
  • Demo_github 希尔排序 希尔排序(Shell Sort)又称为缩小增量排序,它是一种插入排序。它是直接插...
    SkyMing一C阅读 1,002评论 0 1
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 6,601评论 0 13
  • 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;不稳定:如果a原本在b的前面,而a=b,排序之后a可...
    意识流丶阅读 3,303评论 2 9
  • 我和儿子今天下午都休息,下午和几个同学的妈妈聊了聊,关于暑假补课,关于暑假补英语补体育的事,晚上我在亲子通读群里读...
    志郁阅读 327评论 2 7

友情链接更多精彩内容