6 Java Shell排序

希尔排序是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

 

1、基本思想

将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;每次再将gap折半减小,循环上述操作;当gap=1时,利用直接插入,完成排序。

 

2、算法描述

①. 选择一个增量序列t1,t2,…, tk ,其中ti > tj,tk = 1;(一般初次取数组半长,之后每次再减半,直到增量为1)

②. 按增量序列个数k,对序列进行k 趟排序;

③. 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

 

3、代码实现

复制代码
public class ShellSort {

    public static void main(String[] args) {
        Long startTime = System.currentTimeMillis();
        //int[] array = new int[]{10, 1, 9, 2, 8, 3, 7, 4, 6, 5};
        int[] array = new int[100000];
        for (int i = 0; i < 100000; i++) {
            array[i] = (int) (Math.random() * 100000);
        }
        shellSort(array);
        Long endTime = System.currentTimeMillis();
        System.out.println(endTime - startTime);
    }
    
    public static void shellSort(int[] array) {
        int len = array.length;
        int gap = len / 2;
        int i, j, tmp;
        while (gap >= 1) {
            for (i = gap; i < len; i++) {
                tmp = array[i];
                j = i - gap;
                while (j >= 0 && array[j] >= tmp) {
                    array[j + gap] = array[j];
                    j = j - gap;
                }
                j = j + gap;
                if (j != i) {
                    array[j] = tmp;
                }
            }
            //System.out.println(Arrays.toString(array));
            gap = gap / 2;
        }
    }
}
View Code
复制代码

 

 

posted @   Latiny  阅读(183)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示