希尔排序 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. JDK 8 新增的 LongAdder,得过来看一下

    前言 在介绍 AtomicInteger 时,已经说明在高并发下大量线程去竞争更新同一个原子变量时,因为只有一个线程能够更新成功,其他的线程在竞争失败后,只能一直循环,不断的进行 CAS 尝试,从而浪 ...

  2. 【Kata Daily 190910】Who likes it?(谁点了赞?)

    题目: Description: You probably know the "like" system from Facebook and other pages. People ...

  3. c#方法 最大值我最小值

    static void Main(string[] args) { int[] a = { 6, 8, 9, 5, 2, 165, 58966 }; Console.WriteLine("最 ...

  4. C# 集合类(二)

    C# 集合类自己经常用到: 数组(Array).动态数组(ArrayList).列表(List).哈希表(Hashtable).字典(Dictionary),对于经常使用的这些数据结构,做一个总结,便 ...

  5. pip升级失败

    python -m pip install --upgrade pip失败 解决办法: easy_install pip

  6. PS中抠图的四种方法介绍

    工具/原料 photoshop 软件(我用的是photoshop cc) 需要抠图的图片 开始的步骤 打开ps 打开图片,ctrl+O 魔棒抠图法 对于前景和后景有明显差别的图片用魔棒抠图法抠图比较容 ...

  7. 管理机--Jumpserver由docker搭建

    一.环境准备 使用Centos7.0及以上版本,(网要好哦) 二.安装docker 1,下载,安装,启动 docker yum -y install docker         #安装docker ...

  8. CSharpFlink分布式实时计算,OutOfMemoryException异常,你意想不到的原因。

    目录 一.测试过程及问题 二.问题排查及分析过程 三.问题分析及解决过程 四.问题解决初步结果 一.测试过程及问题 从昨天15点左右开始测试,1个主节点,10个计算节点,1000个数据点,每个数据点3 ...

  9. 1. Spark的安装及介绍

    *以下内容由<Spark快速大数据分析>整理所得. 读书笔记的第一部分是记录如何安装Spark?同时,简单介绍下Spark. 一.Spark安装 二.Spark介绍 一.Spark安装 如 ...

  10. Python_教程_使用Visual Studio Code开发Django项目

    如何获得 Visual Studio Code 访问 http://code.visualstudio.com 下载并安装. 前提条件 安装Python 2.7 及 Python 3.5,Window ...