希尔排序

希尔排序

希尔排序是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。

/**
 * 希尔排序
 * 希尔排序是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序
 */
public class ShellSort {

    /**
     * 算法描述:
     * 1.首先它把较大的数据集合分割成若干个小组(逻辑上分组),然后对每一个小组分别进行插入排序,此时,插入排序所作用的数据量比较小(每一个小组),插入的效率比较高
     * 2.每个分组进行插入排序后,各个分组就变成了有序的了(整体不一定有序)
     * 3.然后缩小增量为上个增量的一半,继续划分分组,此时,每个分组元素个数多了,但是,数组变的部分有序了,插入排序效率同样比高
     * 4.同理对每个分组进行排序(插入排序),使其每个分组各自有序
     * 5.重复3~4当增量减至1时,整个数组被分为一组,此时,整个数组已经接近有序了,插入排序效率高
     * @param args
     */
    public static void main(String args[]) {
        int[] arr = {11, 6, 2, 7, 23,7, 8, 3, 9, 12, 0,27};
        int length = arr.length;

        System.out.print("排序前---------------------:");
        printArr(arr);

        int second = 1;
        //进行分组,最开始时增量(gap)为数组长度的一半
        for(int gap = length/2; gap > 0;gap /= 2){
            //对个分组进行插入排序
            for(int i=gap;i<length;i++){
                int j = i;
                int current = arr[i];
                while(j-gap>=0 && arr[j-gap]>current){
                    arr[j] = arr[j-gap];
                    j = j-gap;
                }
                arr[j] = current;
            }

            System.out.print("第"+second+"次分组,增量为:"+gap+"排序结果:");
            printArr(arr);

        }
    }

    /**
     * 输出排序结果
     * @param arr
     */
    private static void printArr(int[] arr){
        for(int i=0;i<arr.length;i++) {
            System.out.print(arr[i]+",");
        }
        System.out.println();
    }
}

执行过程
排序前------------------------------:11,6,2,7,23,7,8,3,9,12,0,27,
第1次分组,增量为:6排序结果:8,3,2,7,0,7,11,6,9,12,23,27,
第1次分组,增量为:3排序结果:7,0,2,8,3,7,11,6,9,12,23,27,
第1次分组,增量为:1排序结果:0,2,3,6,7,7,8,9,11,12,23,27,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值