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

希尔排序

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

初始时,有一个大小为 10 的无序序列。
在第一趟排序中,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。
接下来,按照直接插入排序的方法对每个组进行排序。
在第二趟排序中,我们把上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为 2 组。
按照直接插入排序的方法对每个组进行排序。
在第三趟排序中,再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1。 这样相隔距离为 1 的元素组成一组,即只有一组。
按照直接插入排序的方法对每个组进行排序。此时,排序已经结束。
需要注意一下的是,图中有两个相等数值的元素 5 和 5 。我们可以清楚的看到,在排序过程中,两个元素位置交换了。
所以,希尔排序是不稳定的算法。
输入图片说明

package com.lifeibigdata.fight;

/**
 * Created by lifei on 16/10/24.
 */
public class ShellSort {

    static int[] shellSort(int[] a){
        int gap = a.length / 2;
        while (gap >= 1){
            // 把距离为 gap 的元素编为一个组,扫描所有组
//            for (int i = gap; i < a.length; i++) {
//                int j;
//                int temp = a[i];

                  //对距离为 gap 的元素组进行排序
//                 for (j = i - gap; j >= 0 && temp < a[j]; j = j - gap) {//TODO   j - gap
//                     a[j + gap] = a[j];//TODO i - gap + gap
//                 }
//                 a[j + gap] = temp;//TODO   j - gap + gap = j
//             }

            for (int i = gap; i < a.length; i++) {
                if (a[i] < a[i - gap]){// 2 0; 3  1;4  2;
                    int tmp = a[i];
                    a[i] = a[i - gap];
                    a[i - gap] = tmp;
                }
            }

            gap = gap /2;
        }
        return a;
    }

    public static void main(String[] args) {
        int[] a = new int[]{9  ,  1   , 2  ,  5  ,  7  ,  4  ,  8  ,  6  ,  3   , 5};
        int[] r = shellSort(a);
        for (int x:r) {
            System.out.println(x);
        }
    }

}

直接插入排序和希尔排序的比较
直接插入排序是稳定的;而希尔排序是不稳定的。
直接插入排序更适合于原始记录基本有序的集合。
希尔排序的比较次数和移动次数都要比直接插入排序少,当N越大时,效果越明显。
在希尔排序中,增量序列gap的取法必须满足:最后一个步长必须是 1 。
直接插入排序也适用于链式存储结构;希尔排序不适用于链式结构。

转载于:https://my.oschina.net/datacube/blog/775064

相关文章:

  • vu3响应式原理 代码分析
  • Java Tomcat SSL 服务端/客户端双向认证(一)
  • vue3中 setup注意点
  • redis简介
  • 《Spark GraphX in Action》书评及作者访谈
  • vue3的 computed 计算属性 与 watch监听
  • Diomidis Spinellis:有效的调试
  • ListView的简单使用
  • vue3技术 watch时 value问题
  • 最大流学习笔记(1)
  • vue3 watchEffect 函数
  • Apaceh 多虚拟主机多站点配置两种方案
  • ubutnu安装geany
  • vue3生命周期钩子函数
  • 每天一个linux命令(11):nl命令
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • bearychat的java client
  • docker容器内的网络抓包
  • ES6 ...操作符
  • gf框架之分页模块(五) - 自定义分页
  • mysql 5.6 原生Online DDL解析
  • ucore操作系统实验笔记 - 重新理解中断
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 动态魔术使用DBMS_SQL
  • 记一次用 NodeJs 实现模拟登录的思路
  • 每天一个设计模式之命令模式
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 以太坊客户端Geth命令参数详解
  • 用简单代码看卷积组块发展
  • 怎样选择前端框架
  • 第二十章:异步和文件I/O.(二十三)
  • 交换综合实验一
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (C#)一个最简单的链表类
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)程序员技术练级攻略
  • (转)人的集合论——移山之道
  • (轉)JSON.stringify 语法实例讲解
  • .equals()到底是什么意思?
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NetCore 如何动态路由
  • /*在DataTable中更新、删除数据*/
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @Data注解的作用
  • @Mapper作用