希尔排序 no 实现

  希尔排序其实就是插入排序。只不过希尔排序在比较的元素的间隔不是1。 我们知道插入排序 都是 一个一个和之前的元素比较。发现比之前元素小就交换位置。但是希尔排序可能是和前第n个元素比较,如果发现比前第n个元素小就和前第n个元素交换位置。具体看下图

    

  第一趟比较。n是为5。也就是说每个数和前面第5个数比较。如果发现小于前面第5个数的话。交换位置。

  所以我们看到 72 比 592 小。 所以交换位置。 283 比 348 小。继续交换

  第二趟比较。 n 是2。同理

  最后一次比较。n是1 ,注意这个时候就是插入排序了。

  这个 5 2 1 这种增量数字的选择到底是基于什么来选择的。其实我也不知道,一般的数字都可以,只不过性能不一定那么快。还有比如说4 排序了。 2 再排序的话 性能就会差一些。因为相对于4已经排序了的数组。已经有一部分的数组已经排好序了。

  这里给出几个比较快的 排序增量的sequence

  

    //Sedgewick 增量序列的最坏时间复杂度为 O(N4/3);平均时间复杂度约为 O(N7/6)。
//hi=max(9∗4^n−9∗2^n+1, 2^(n + 2) * (2^(n + 2) - 3)) + 1
//5 是由N = 0 得出来的
//28
private static int INCREMENT_SEQUENCE_SEDGEWICK[] = {
1,5,19,41,109,209,505,929,
2161,3905,8929,16001,36289,64769,146305,260609,
587521,1045505,2354689,4188161,9427969,16764929,37730305,67084289,
150958081,268386305,603906049,1073643521};

INCREMENT_SEQUENCE_SEDGEWICK

 

    //Knuth  sequence 3N + 1 , N 是之前的元素
//O(n^1.5)
//20
int INCREMENT_SEQUENCE_KNUTH[] = {
1,4,13,40,121,364,1093,3280,
9841,29524,88573,265720,797161,2391484,7174453,21523360,
64570081,193710244,581130733,1743392200};

INCREMENT_SEQUENCE_KNUTH

  具体的实现可以在这里看到 ->>>>>>https://github.com/Cheemion/algorithms/blob/master/src/com/algorithms/sort/ShellSort.java

  这里还有关于什么shell排序很快的原因https://www.zhihu.com/question/24637339

  Sedgewick 增量序列的ShellSort 最坏时间复杂度为 O(N4/3);平均时间复杂度约为 O(N7/6)

排序--ShellSort 希尔排序的更多相关文章

  1. 排序算法--希尔排序(Shell Sort)_C#程序实现

    排序算法--希尔排序(Shell Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困难 ...

  2. 排序算法-希尔排序(Java)

    package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className ShellSort * @date 201 ...

  3. C数据结构排序算法——希尔排序法用法总结(转http://www.cnblogs.com/skywang12345/p/3597597.html)

    希尔排序介绍 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它 ...

  4. 数据结构和算法(Golang实现)(22)排序算法-希尔排序

    希尔排序 1959 年一个叫Donald L. Shell (March 1, 1924 – November 2, 2015)的美国人在Communications of the ACM 国际计算机 ...

  5. 《Algorithm算法》笔记:元素排序(2)——希尔排序

    <Algorithm算法>笔记:元素排序(2)——希尔排序 Algorithm算法笔记元素排序2希尔排序 希尔排序思想 为什么是插入排序 h的确定方法 希尔排序的特点 代码 有关排序的介绍 ...

  6. 学习C#之旅 冒泡排序,选择排序,插入排序,希尔排序[资料收集]

    关于冒泡排序,选择排序,插入排序,希尔排序[资料收集]  以下资料来源与网络 冒泡排序:从后到前(或者从前到后)相邻的两个两两进行比较,不满足要求就位置进行交换,一轮下来选择出一个最小(或最大)的放到 ...

  7. 插入排序、冒泡排序、选择排序、希尔排序、高速排序、归并排序、堆排序和LST基数排序——C++实现

    首先是算法实现文件Sort.h.代码例如以下: <pre name="code" class="java">/* * 实现了八个经常使用的排序算法: ...

  8. 使用 js 实现十大排序算法: 希尔排序

    使用 js 实现十大排序算法: 希尔排序 希尔排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  9. Java基础知识强化57:经典排序之希尔排序(ShellSort)

    1. 希尔排序的原理: 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出 ...

随机推荐

  1. GDB调试基础使用方法

    尽管目前使用的VS code可以使用插件一键构建和运行程序,但GDB作为调试利器,还是值得花时间去学习的. 概述 GDB(GNU Debugger) 是一个由GNU开源组织发布的.UNIX/LINUX ...

  2. https中引入http资源资源所导致的问题

    问题描述 因为公司要求所有生产环境为了安全性需求,全部都走https, 并且在Nginx里面加入了Content-Security-Policy "upgrade-insecure-requ ...

  3. 有了Cloud Alert电话报警,再也不怕遗漏告警了

    Cloud Alert 的部分应用部署在阿里云上,使用了多方面的监控服务: 阿里自身的ECS服务器和网站. Zabbix 监控服务器应用程序. OneAPM 的应用级监控. 腾讯云拨测,做网站监控. ...

  4. 利用日志文件getshell

    一.包含日志文件漏洞利用概述           当我们没有上传点,并且也没有url_allow_include功能时,我们就可以考虑包含服务器的日志文件.        利用思路也比较简单,当我们访 ...

  5. linux系统克隆系统盘

    本文将介绍两种方式的系统盘的完整的备份,两种方式各有优缺点,需要根据实际情况来进行选择 使用dd的完整镜像克隆的方式 使用tar去备份数据,安装grub的方式 dd方式 优点: 简单,一条命令 dd ...

  6. linux centos 6.x 装机后基本优化

    1.关闭SELinux /etc/selinux/config配置文件内替换 se -i 's/SELINUX=enforcing/SELINUX=disabled/g'需要重启grep SELINU ...

  7. [原题复现]HCTF 2018 Warmup(文件包含)

    HCTF 2018 Warmup 原题复现:https://gitee.com/xiaohua1998/hctf_2018_warmup 考察知识点:文件包含漏洞(phpmyadmin 4.8.1任意 ...

  8. day02-多任务(进程和协程)

    一.多任务的概念       简单地说,就是操作系统可以同时运行多个任务.打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行.还有很多任务 ...

  9. 微信公众号获取openid(php实例)

    微信公众号获取openid 公众号获取openid的方法跟小程序获取openid其实是一样的,只是code获取的方式不一样 小程序获取code: 用户授权登录时调用wx.login即可获取到code ...

  10. php 数据转储Excel文件

    1.下载PHPExcel文件 下载地址:https://www.php.cn/xiazai/leiku/1491 2.在php写入以下代码,执行即可 $arr = Db::name('user')-& ...