希尔排序就是升级版本的 插入排序,
插入排序的文章请看我另一篇:iOS(Object C) 插入排序-CSDN博客
希尔排序的思想:
1.取一个整数d1 = N/2 (N为数组长度),将数组里的元素分成d1 个组,每组相邻元素之间的距离为d1,在各组内进行插入排序
2.取第二个整数d2=d1/2,重复步骤1的分组排序过程,直到di=1;即所有元素在同一组内直接进行插入排序.
3.完成步骤1、2,即可以得到一个有序数组.
如下图,数组为[5,3,8,7,1,4,2,6,9],
d1 = 数组长度9/2 = 4; 所以将数组分成4组,没组的元素之间距离为4,即(5,3,8为一组,7,1为一组,4,2为一组,6,9为一组),将没组进行插入排序即可
插入排序的思想:
可以想象你在打牌,手里有一张牌2,
第一次摸到一张牌5; 5 比1 大,所以摸到的牌5放在1的右边; (此时手里的牌为 2->5)
第二次摸到一张牌3; 3比5小,所以3和5互换位置,再拿3和2比,3比2大,3不动(此时手里的牌为 2-> 3 -> 5)
第三次摸到一张牌1,1比5小,所以1和5互换位置;再拿1和3比,1比3小,所以1和3互换位置;再拿1和3比,1比2小,所以1和2互换位置;
可以看到插入排序是相邻的两张牌(距离为1)比较大小,而希尔排序是距离为di的两张牌的牌比大小,明白了这个原理,就很简单了.
- (NSMutableArray *)shellSort:(NSMutableArray *)array
{//定义一个间隔数int gap = (int)array.count/2;while (gap >= 1){for (int i = gap; i < array.count; i ++){int temp = [array[i] intValue];int j = i;while (j >= gap && temp < [array[j-gap] intValue]){[array exchangeObjectAtIndex:j withObjectAtIndex:j-gap];j -= gap;}}gap = gap/2;}return array;
}
仔细比较插入排序和希尔排序的代码,你会发现上 把插入排序里的数字1,改为间隔距离di, 即可完成99%,最后再把di整除2即可