首页 > 编程语言 >【排序算法】希尔排序

【排序算法】希尔排序

时间:2023-03-14 17:46:42浏览次数:29  
标签:arr int 插入排序 算法 gap 插入 希尔 排序

1  前言

今天把排序的几个算法过一下,这节我们看一下希尔排序,简单的来说就是多次插入排序,我们看示例。

2  代码示例

/**
 * 希尔排序,也就是多次插入排序
 * 可以参考插入排序,然后外边套一层间隙循环
 * 间隙到最后为1,就跟插入排序一样了
 */
public static void shellSort(int[] arr) {
    for (int gap = arr.length / 2; gap >= 1; gap /= 2) {
        // 外层循环,注意间隙 i=i+gap
        for (int i = gap; i < arr.length; i+=gap) {
            // 升序,arr[i] 当前要插入的值发现比前边的最后一个元素都大说明不需要往前插入,跳过
            if (arr[i-gap] < arr[i]) {
                continue;
            }
            // 记录要进行插入的值
            int temp = arr[i];
            // 记录内层循环的起始位置,从最后一个元素开始遍历
            int j = i-gap;
            // 内层循环,间隙j=j-gap
            for (; j >= 0; j-=gap) {
                // 升序,当发现有比我大的,就往后放
                if (arr[j] > temp) {
                    arr[j+gap] = arr[j];
                    // 持续往后放
                    continue;
                }
                // 发现有比我小的了,停止遍历
                break;
            }
            /**
             * 找到位置了,进行替换 这里为什么 +gap? 参考插入排序最后的+1 这里是间隙
             * 能走到这考虑两种情况:
             * 1、内层循环遍历到索引为 -1时停止的,也就是前边的所有元素都比待插入的大 比如 1 2 5 要插入 0 这是索引为-1 + 1 = 0就是要放入的位置
             * 2、找到一个比待插入的小了 比如 1 2 5 要插入 4 到 2 的时候停止了 这是索引为 1 所以+1 = 2就是要放入待插入的位置
             */
            arr[j+gap] = temp;
        }
        System.out.println("当前间隙:"+ gap + "排序后:" + Arrays.stream(arr).mapToObj(String::valueOf).collect(Collectors.joining(",")));
    }
}
public static void main(String[] args) {
    int[] arr = IntStream.generate(() -> ThreadLocalRandom.current().nextInt(10000)).limit(100).toArray();
    System.out.println("排序前:" + Arrays.stream(arr).mapToObj(String::valueOf).collect(Collectors.joining(",")));
    shellSort(arr);
    System.out.println("排序后:" + Arrays.stream(arr).mapToObj(String::valueOf).collect(Collectors.joining(",")));
}

3  小结

有写的不对的地方,欢迎指正哈。

标签:arr,int,插入排序,算法,gap,插入,希尔,排序
From: https://www.cnblogs.com/kukuxjx/p/17215722.html

相关文章

  • 【排序算法】插入排序
    1 前言今天把排序的几个算法过一下,这节我们看一下插入排序,简单的来说就是从第2个元素往前寻找位置进行插入,我们看示例。2 代码示例/***插入排序*从第2个元素......
  • 【排序算法】直接选择排序
    1 前言今天把排序的几个算法过一下,这节我们看一下直接选择排序,简单的来说就是默认某个位置为最小然后从位置后的元素逐个比较进行交换,我们看示例。2 代码示例/**......
  • 算法-练习2
    题1给你两个 非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表......
  • 笔试算法《字符串排序_1》
    题目描述编写一个程序,将输入字符串中的字符按如下规则排序。规则1:英文字母从A到Z排列,不区分大小写。如,输入:Type输出:epTy规则2:同一个英文字母的大小写同时存在时,......
  • Steam流中的sorted方法排序
    使用方法packagecom.sports.basketball.controller.dto;importjava.util.ArrayList;importjava.util.Comparator;importjava.util.List;importjava.util.stream.Col......
  • [思维提升|干货All in]6种算法解决LeetCode困难题:滑动窗口最大值
    为了更好的阅读体验,欢迎阅读原文:[思维提升|干货Allin]6种算法解决LeetCode困难题:滑动窗口最大值(eriktse.com)最近在leetcode遇到一道非常经典的题目:239.滑动窗口最......
  • 32位汇编语言实现冒泡排序
    INCLUDEIrvine32.inc.dataarrdd99,2,3,1,22,88,7,77,54;定义数组lendd($-arr)/4;定义数组的长度变量.codemainPROCmovedx,offsetarr......
  • Tarjan算法详解
    Tarjan算法介绍TarjanTarjan算法是用于在有向图中求强连通分量的算法这里给出强连通分量的定义:有向图中一个最大的图,使这个图中每个两点都能够互相到达。这个最大的图称......
  • 决策树算法
    fromsklearnimporttreefromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitimportnumpyasnpif__name__=="__main__":......
  • k近邻算法
    如果一个样本在特征空间中的k个最“相似”(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别相似度:即两个点的距离来衡量距离越近越近相似度......