基础算法-希尔排序的理解与实现-Android版

希尔排序:直接插入排序的进化版,又称为“缩小增量排序”; 根据key值,将待排序数列分成若干个子序列,针对每一个子序列进行直接插入排序;然后逐步缩小key值,直到key=1,此时即为直接插入排序;

例如:       

                         a[] = {5, 3, 9, 6, 2, 1, 4, 0, 8, 7};

假如key=5, 可知{5, 1}===>插入排序后{1 , 5}

                   可知{3, 4}===>插入排序后{3 ,4}

                   可知{9, 0}===>插入排序后{0 , 9}

                   可知{6, 8}===>插入排序后{6 , 8}

                    可知{2,7}===>插入排序后{2 , 7}

最后得到的序列为    {1, 3, 0, 6, 2, 5, 4, 9, 8, 7}

然后逐步缩减key值,直到key=1, 完成排序。

代码实现 1: key= a.length/ 2,  即: key = a.length >> 1

                int a[] = {5, 3, 9, 6, 2, 1, 4, 0, 8, 7};
                for (int i = 0; i < a.length; i++) {
                    Log.i("chy==数列初始===", "====" + a[i]);
                }
                /**
                 * 希尔排序外层循环控制循环次数,就是间隔key减少至1的次数
                 */
                for (int gap = a.length >> 1; gap > 0; gap = gap >> 1) {
                    /**
                     * 每一个key, 可以得到诺干个子序列; 针对每一个子序列做直接插入排序
                     * 当 key=1 时,整个序列为一个子序列,进行直接插入排序
                     */
                    for (int i = gap; i < a.length; i++) {
                        for (int j = i; j > gap - 1; j = j - gap) {
                            if (a[j - gap] > a[j]) {
                                int temp = a[j];
                                a[j] = a[j-gap];
                                a[j-gap] = temp;
                            } else {
                                break;
                            }
                        }
                    }
                }

                for (int i = 0; i < a.length; i++) {
                    Log.i("chy==输出结果===", "====" + a[i]);
                }

代码实现 2: Knuth序列法======>   key= key*3 / 1

                int a[] = {5, 3, 9, 6, 2, 1, 4, 0, 8, 7};
                for (int i = 0; i < a.length; i++) {
                    Log.i("chy==初始结果===", "====" + a[i]);
                }
                /**
                 * 得到 kunth 相对于整个数组的最大值
                 */
                int knuth = 1;
                while (knuth <= a.length/3){
                    knuth = knuth * 3 + 1;
                }
                /**
                 * 希尔排序外层循环控制循环次数,就是间隔key减少至1的次数
                 */
                for (int gap = knuth; gap > 0; gap = (gap-1) /3 ) {
                    /**
                     * 每一个key, 可以得到诺干个子序列; 针对每一个子序列做直接插入排序
                     * 当 key=1 时,整个序列为一个子序列,进行直接插入排序
                     */
                    for (int i = gap; i < a.length; i++) {
                        for (int j = i; j > gap - 1; j = j - gap) {
                            if (a[j - gap] > a[j]) {
                                int temp = a[j];
                                a[j] = a[j-gap];
                                a[j-gap] = temp;
                            } else {
                                break;
                            }
                        }
                    }
                }
                for (int i = 0; i < a.length; i++) {
                    Log.i("chy==结果===", "====" + a[i]);
                }

希尔排序记忆: 将待排序数列分成不同段,每段进行直接插入排序;从小序列开始,最后连成一片;上两种形式只是key 的取值方法不一致,其他的都是一样的原理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Heynchy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值