排序--ShellSort 希尔排序
希尔排序 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 希尔排序的更多相关文章
- 排序算法--希尔排序(Shell Sort)_C#程序实现
排序算法--希尔排序(Shell Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困难 ...
- 排序算法-希尔排序(Java)
package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className ShellSort * @date 201 ...
- C数据结构排序算法——希尔排序法用法总结(转http://www.cnblogs.com/skywang12345/p/3597597.html)
希尔排序介绍 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它 ...
- 数据结构和算法(Golang实现)(22)排序算法-希尔排序
希尔排序 1959 年一个叫Donald L. Shell (March 1, 1924 – November 2, 2015)的美国人在Communications of the ACM 国际计算机 ...
- 《Algorithm算法》笔记:元素排序(2)——希尔排序
<Algorithm算法>笔记:元素排序(2)——希尔排序 Algorithm算法笔记元素排序2希尔排序 希尔排序思想 为什么是插入排序 h的确定方法 希尔排序的特点 代码 有关排序的介绍 ...
- 学习C#之旅 冒泡排序,选择排序,插入排序,希尔排序[资料收集]
关于冒泡排序,选择排序,插入排序,希尔排序[资料收集] 以下资料来源与网络 冒泡排序:从后到前(或者从前到后)相邻的两个两两进行比较,不满足要求就位置进行交换,一轮下来选择出一个最小(或最大)的放到 ...
- 插入排序、冒泡排序、选择排序、希尔排序、高速排序、归并排序、堆排序和LST基数排序——C++实现
首先是算法实现文件Sort.h.代码例如以下: <pre name="code" class="java">/* * 实现了八个经常使用的排序算法: ...
- 使用 js 实现十大排序算法: 希尔排序
使用 js 实现十大排序算法: 希尔排序 希尔排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
- Java基础知识强化57:经典排序之希尔排序(ShellSort)
1. 希尔排序的原理: 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出 ...
随机推荐
- JDK 8 新增的 LongAdder,得过来看一下
前言 在介绍 AtomicInteger 时,已经说明在高并发下大量线程去竞争更新同一个原子变量时,因为只有一个线程能够更新成功,其他的线程在竞争失败后,只能一直循环,不断的进行 CAS 尝试,从而浪 ...
- 【Kata Daily 190910】Who likes it?(谁点了赞?)
题目: Description: You probably know the "like" system from Facebook and other pages. People ...
- c#方法 最大值我最小值
static void Main(string[] args) { int[] a = { 6, 8, 9, 5, 2, 165, 58966 }; Console.WriteLine("最 ...
- C# 集合类(二)
C# 集合类自己经常用到: 数组(Array).动态数组(ArrayList).列表(List).哈希表(Hashtable).字典(Dictionary),对于经常使用的这些数据结构,做一个总结,便 ...
- pip升级失败
python -m pip install --upgrade pip失败 解决办法: easy_install pip
- PS中抠图的四种方法介绍
工具/原料 photoshop 软件(我用的是photoshop cc) 需要抠图的图片 开始的步骤 打开ps 打开图片,ctrl+O 魔棒抠图法 对于前景和后景有明显差别的图片用魔棒抠图法抠图比较容 ...
- 管理机--Jumpserver由docker搭建
一.环境准备 使用Centos7.0及以上版本,(网要好哦) 二.安装docker 1,下载,安装,启动 docker yum -y install docker #安装docker ...
- CSharpFlink分布式实时计算,OutOfMemoryException异常,你意想不到的原因。
目录 一.测试过程及问题 二.问题排查及分析过程 三.问题分析及解决过程 四.问题解决初步结果 一.测试过程及问题 从昨天15点左右开始测试,1个主节点,10个计算节点,1000个数据点,每个数据点3 ...
- 1. Spark的安装及介绍
*以下内容由<Spark快速大数据分析>整理所得. 读书笔记的第一部分是记录如何安装Spark?同时,简单介绍下Spark. 一.Spark安装 二.Spark介绍 一.Spark安装 如 ...
- Python_教程_使用Visual Studio Code开发Django项目
如何获得 Visual Studio Code 访问 http://code.visualstudio.com 下载并安装. 前提条件 安装Python 2.7 及 Python 3.5,Window ...