当前位置: 首页 > article >正文

【算法-希尔】

定义

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

  • 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;

  • 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;

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

特点

  • 时间复杂度: 平均为 O(n log n),具体取决于所选择的间隔序列。
  • 空间复杂度: O(1),是原地排序。
  • 稳定性: 不稳定排序。

算法步骤

  1. 将元素分为n列,并对每列进行插入排序。

  2. 将n列元素按行进行合并。

  3. 重复步骤1-2,其中元素的列数为上次的一半。

代码

public class ShellSort {
    public static void shellSort(int[] arr) {
        int n = arr.length;

        // 初始gap为数组长度的一半,逐步缩小gap
        for (int gap = n / 2; gap > 0; gap /= 2) {

            // 对每个子序列进行插入排序
            for (int i = gap; i < n; i++) {
                int temp = arr[i];
                int j;

                // 在子序列中进行插入排序
                for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
                    arr[j] = arr[j - gap];
                }
                // 将temp放在正确的位置
                arr[j] = temp;
            }
        }
    }
    public static void main(String[] args) {
        int[] arr = {12, 34, 54, 2, 3,1,6,40};
        shellSort(arr);
        System.out.println("排序后的数组:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}
  • 外层循环控制 gap(间隔),初始值为数组长度的一半,每次迭代后将 gap 减半,直到 gap 为 1。
  • 内层循环从 gap 位置开始,对每个元素进行插入排序。对于每个 i 位置的元素,在它之前 gap 个位置范围内寻找插入位置,并进行元素的移动。
  • 最后将 temp 插入到正确的位置。

http://www.kler.cn/a/291359.html

相关文章:

  • 无插件H5播放器EasyPlayer.js视频流媒体播放器如何开启electron硬解码Hevc(H265)
  • 概念解读|K8s/容器云/裸金属/云原生...这些都有什么区别?
  • AI模型新发现:精度的重要性超出预期
  • ue中使用webui有效果白色拖动条 有白边
  • 【qt】控件3
  • Web3浪潮下的区块链应用:从理论到实践的全面解析
  • websocket和轮询的区别?
  • Leetcode面试经典150题-137.只出现一次的数字II
  • 深度孤立森林 Deep Isolation Forest论文翻译(上)
  • 第二百一十六节 JSF教程 - JSF基本标签、JSF表单文本框示例
  • ffmpeg音视频开发从入门到精通——ffmpeg实现音频抽取
  • 【R语言速通】2.循环和条件判断
  • verilog仿真激励
  • TCP协议 配合 Wireshark 分析数据
  • 开源还是封闭?人工智能的两难选择
  • 人工智能关键技术怎么清晰的划分
  • 云电脑超越传统PC——再谈公有云的新市场
  • 基于Java的在线文献检索系统
  • IP网络协议
  • stm32 8080时序驱动lcd屏幕
  • 仕考网:公务员和事业编的区别
  • matlab二维热传导显示有限差分法计算(代码)
  • 活动系统开发之采用设计模式与非设计模式的区别-需求整理
  • 使用FFmpeg实现简单的拉流、推流、视频解码Demo
  • 微服务中的服务降级与熔断机制
  • 搜维尔科技:使用Geomagic Touch X 对机械臂进行远程遥操作