iOS(Object C) 希尔排序

希尔排序就是升级版本的 插入排序,

插入排序的文章请看我另一篇: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即可

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值