希尔排序

希尔排序是对插入排序的一种改进。
下面对希尔排序的介绍来自于维基百科

*希尔排序也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位

下面是代码实现

package com.neway.sort;

/**
 * Created by Neway on 2015/12/6.
 */
public class ShellSort implements Sort {

    public static void main(String args[]) {
        int arr[] = {13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10};
        Sort sort = new ShellSort();
        sort.sort(arr);
        for (int i : arr) {
            System.out.print(i + " ");
        }
    }

    @Override
    public void sort(int[] arr) {
        int step = 5;
        while (step > 0) {
            int x = (arr.length / step ) ;
            for (int i = 0; i < arr.length / x; i++) {
                int stepArray[] = new int[x];
                for (int m = 0; m < x; m++) {
                    stepArray[m] = arr[m * step + i];
                }
                insertSort(stepArray);
                for (int m = 0; m < x; m++) {
                    arr[m * step + i] = stepArray[m];
                }
            }
            step = step / 2;
        }
    }

    public void insertSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int insertPosition = -1;
            int cache = arr[i]; //缓存当前的值

            //从前面排好序的数字中间找到第一个大于当前数字的,它的位置就是当前数字应该在的位置。
            for (int m = 0; m < i; m++) {
                if (arr[i] < arr[m]) {
                    insertPosition = m;
                    break;
                }
            }

            //如果找到了了,就把数字依次往后移动一位。
            if (insertPosition != -1) {
                for (int j = i; j > insertPosition && insertPosition != -1; j--) {
                    arr[j] = arr[j - 1];
                }
                // 把当前数字放到腾出来的位置上去。
                arr[insertPosition] = cache;
            }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值