希尔算法

106 阅读1分钟

希尔算法是直接插入算法的改进版本,比直接插入算法多了一套循环。

直接插入的代码在上篇文章中。

- (void)method5 {
    Tick
    for (NSInteger gap = self.ArrayM.count / 2; gap > 0; gap /= 2) {
        for (NSInteger i = gap; i < self.ArrayM.count; i++) {
//            i指向是无序序列中的第一个
            //通过gap区分的数组,有几个特点,1.gap前的数字都是每个小组中的最小有序序列,
//            2.从i后面都是有顺序的无序的序列,因为间隔都相同,虽然不是一个组的,也可以按顺序循环
            NSNumber *temp = self.ArrayM[i];
            NSInteger j = i;
            for (; j >= gap && [self.ArrayM[j - gap] integerValue]> temp.integerValue; j -= gap) {
                self.ArrayM[j] = self.ArrayM[j - gap];
//                j指向的也是无序的第一个,向前循环
//                这层循环的是有序的序列
            }
            NSLog(@"________");
            self.ArrayM[j] = temp;
        }
    }
    Tock
}

与直接插入算法,时间对比