希尔算法是直接插入算法的改进版本,比直接插入算法多了一套循环。
直接插入的代码在上篇文章中。
- (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
}
与直接插入算法,时间对比