希尔排序

希尔排序是一种基于插入排序的快速排序算法,通过设定间隔序列来改进效率。本文详细介绍了希尔排序的工作原理,并提供了具体的代码实现,帮助读者理解并掌握这种高效的排序方法。
摘要由CSDN通过智能技术生成

代码实现

package com.springboot.数据结构.sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

/**
 * @author: 牧羊
 * @Date: 2020/5/16 12:03
 * 希尔排序
 */
public class ShellSort {

    public static void main(String[] args) {

        int[] arr = {101,34,119,1,-1,90,123};

        //创建随机数组
        for(int i = 0 ; i < 80000 ; i++){
            arr[i] = (int) Math.random() * 80000;
        }

        Date date = new Date(){};
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
        String format = simpleDateFormat.format(date);
        System.out.println("排序前时间:" + format);



//        sort(arr);
        sort2(arr);

        Date date2 = new Date(){};
        String format2 = simpleDateFormat.format(date);
        System.out.println("排序后时间:" + format2);
    }

    //交换法
    public static void sort(int[] arr){

        int temp = 0;

        int count = 0;

        //根据见面的逐步分析,会用循环处理
        for(int gap = arr.length/2 ; gap > 0 ; gap /= 2 ){
            for(int i = gap ; i < arr.length ; i++){
                //遍历各组中所有的元素(共gap组,每组有个元素),步长gap
                for(int j = i - gap ; j >= 0 ; j -= gap){
                    //如果当前元素大于加上步长后的那个元素,说明交换
                    if(arr[j]  > arr[j + gap]){
                        temp = arr[j];
                        arr[j] = arr[j + gap];
                        arr[j + gap] = temp;
                    }
                }

            }

        }
        System.out.println(Arrays.toString(arr));

    }

    //位移法(优化)
    public static void sort2(int[] arr){
        //增量gap,并逐步缩小增量
        for(int gap = arr.length/2 ; gap > 0 ; gap /= 2){
            //从第gap个元素,逐个对其所在的组进行直接插入排序
            for(int i = gap ; i < arr.length ; i++){
                int j = i;
                int temp = arr[j];

                if(arr[j] < arr[j - gap]){
                    while (j - gap >= 0 && temp < arr[j -gap]){
                        //移动
                        arr[j] = arr[j-gap];
                        j-=gap;
                    }
                }
                //当退出while时,就给temp找到插入位置
                arr[j] = temp;
            }

        }
        System.out.println(Arrays.toString(arr));
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值