多语言版希尔排序

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

简介

希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。 摘自:百度百科

代码

算法分析

private static final void sort(int[] array, int gap) {for (int i = gap; i < array.length; i++) {int sentinel = array[i];for (int j = i - gap; j >= 0; j -= gap) {if (array[j] > sentinel) {array[j + gap] = array[j];array[j] = sentinel;} else {break;}}}
}// 执行排序
// [27, 12, 36, 12, 24, 68, 59, 91, 45]
sort(array, 5);
// [12, 12, 36, 27, 24, 45, 59, 91, 68]
sort(array, 3);
// [12, 12, 24, 27, 36, 45, 59, 68, 91]
sort(array, 1);

实际上代码里的sort函数本质是一个插入排序,只是序列的遍历增量由1改为变量(gap)指定,当增量不为1时,插入排序改变的是间隔为指定增量的子列表的序列(分组排序),所以排序执行完成后,序列整体并不完全有序,直到增量为1时,排序完成后序列才会变得整体有序(实际直接执行增量为1的排序后,序列可以直接被排好序,但这个排序就就成简单插入排序了),虽然增量不为1的排序并不能使序列整体有序,但可以将其转换的基本有序,最后一步执行插入排序时(增量为1),将会减少元素移动的次数。 希尔排序中的步长取值没有定论,也无法证明一个最优值,这里简单采用列表长度减半的方式来实现

Java版

private static final void sort(int[] array, int gap) {for (int i = gap; i < array.length; i++) {int sentinel = array[i];for (int j = i - gap; j >= 0; j -= gap) {if (array[j] > sentinel) {array[j + gap] = array[j];array[j] = sentinel;} else {break;}}}
}private static final void sort(int[] array) {// 采用列表长度减半的方式选择排序增量,当增量为1时,排序结束for (int gap = array.length / 2; gap > 0; gap /= 2) {sort(array, gap);}
}

Python版

def shell_sort_once(lst, gap):for i in range(gap, len(lst)):key = lst[i]j = i - gapwhile j >= 0:if lst[j] > key:lst[j + gap], lst[j] = lst[j], keyelse:breakj -= gapgap = len(lst) // 2
while gap > 0:shell_sort_once(lst, gap)gap //= 2

结语

希尔排序是一种不稳定的排序(和增量的选择有关),其本质仍是插入排序,通常来说要比插入排序效率要高(与序列本身有关,比如序列本就是有序序列,希尔排序反而不如插入排序)

PS:我在阅读其它的希尔排序代码,总被他们N层循环绕晕,后面当我看懂内部循环实际只是插入排序,外面是一个增量迭代的循环后,才搞清楚,我个人写的时候通常会用函数把单次插入排序提取出来,代码读起来、理解起来会轻松很多。

转载于:https://my.oschina.net/zhanglikun/blog/1861889

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UML 中extend和include的区别

在UML用例图中有两种关系——包含和扩展&#xff0c;容易混淆&#xff0c;下面通过一张表来区别一下这两种关系。 转载于:https://www.cnblogs.com/yonyong/p/8555547.html

hdu 6301 Distinct Values(贪心)题解

题意&#xff1a;长为n的串&#xff0c;给你m个区间&#xff0c;这些区间内元素不重复&#xff0c;问这样的串字典序最小为&#xff1f; 思路&#xff1a;用set保存当前能插入的元素&#xff0c;这样就能直接插入最小元素了。对操作按l排序&#xff0c;因为排过的不用排&#x…

浏览器兼容CSS渐进增强 VS 优雅降级如何选择

由于低级浏览器不支持 CSS3&#xff0c;但是 CSS3 特效太优秀不忍放弃&#xff0c;所以在高级浏览器中使用CSS3&#xff0c;而在低级浏览器只保证最基本的功能。二者的目的都是关注不同浏览器下的不同体验&#xff0c;但是它们侧重点不同&#xff0c;所以导致了工作流程上的不同…

细数sass安装中遇到的坑

前言&#xff1a; 前两天打算清理电脑的时候&#xff0c;遇到了一点特殊的问题&#xff0c;打算重装一些东西&#xff0c;其中就有我一直用的顺手的SASS预编译工具。 但是在重装的时候&#xff0c;我发现我居然不会用了&#xff1f;&#xff1f;&#xff1f; 靠&#xff0c;要不…

442. 数组中重复的数据

442. 数组中重复的数据 给定一个整数数组 a&#xff0c;其中1 ≤ a[i] ≤ n &#xff08;n为数组长度&#xff09;, 其中有些元素出现两次而其他元素出现一次。 找到所有出现两次的元素。 你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗&#xff1f; 示例&am…

[bzoj 2726] 任务安排 (斜率优化 线性dp)

3月14日第三题&#xff01;&#xff01;&#xff01;&#xff08;虽然是15号发的qwq&#xff09; Description 机器上有N个需要处理的任务&#xff0c;它们构成了一个序列。这些任务被标号为1到N&#xff0c;因此序列的排列为1,2,3…N。这N个任务被分成若干批&#xff0c;每批…

2018年,牛客网小白月赛5

第一次啊&#xff0c;补题&#xff0c;希望大佬批评。 题目按我补题顺序来的。 https://www.nowcoder.com/acm/contest/135#question H 题 最大公倍数 题意:给出两个数&#xff0c;求最大公倍数 欧几里德算法算出最大公约数k; 然后算出。最大公倍数即可 代码如下&#xff1a; …

292. Nim 游戏

292. Nim 游戏 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。你们轮流进行自己的回合&#xff0c;你作为先手。每一回合&#xff0c;轮到的人拿掉 1 - 3 块石头。拿掉最后一块石头的人就是获胜者。 假设你们每一步都是最优解。请编写一个函…

0710 mux协议的作用(ppp拨号时如何和gprs进行at指令交互)

ppp拨号使gprs上网的同时如何和gprs模块进行at指令的交互&#xff0c;这是一个问题。 在linux中&#xff0c;ppp拨号上网是内核中支持的&#xff0c;只需要在内核配置中选上。 ppp拨号的方式使gprs进行上网与at指令使gprs上网&#xff0c;两者之间有不同。ppp是一个将用at指令使…

爬虫笔记(十二)——浏览器伪装技术

为什么要进行浏览器伪装技术&#xff1f; 有一些网站为了避免爬虫的恶意访问&#xff0c;会设置一些反爬虫机制&#xff0c;对方服务器会对爬虫进行屏蔽。常见的饭爬虫机制主要有下面几个&#xff1a; 1. 通过分析用户请求的Headers信息进行反爬虫 2. 通过检测用户行为进行反…

650. 只有两个键的键盘

650. 只有两个键的键盘 最初记事本上只有一个字符 ‘A’ 。你每次可以对这个记事本进行两种操作&#xff1a; Copy All&#xff08;复制全部&#xff09;&#xff1a;复制这个记事本中的所有字符&#xff08;不允许仅复制部分字符&#xff09;。Paste&#xff08;粘贴&#x…

Codeforces 626F Group Projects (DP)

题目链接 8VC Venture Cup 2016 - Elimination Round 题意 把$n$个物品分成若干组&#xff0c;每个组的代价为组内价值的极差&#xff0c;求所有组的代价之和不超过$k$的方案数。 考虑DP&#xff0c;$f[i][j][k]$表示考虑到第$i$个物品的时候&#xff0c;还有$j$组尚未分配完…

《活出生命的意义》:人生有何意义?

在你一生的阅读体验中&#xff0c;如果能够有一本书&#xff0c;它的某个章节、某种思想、或者某句话能够触动你的内心&#xff0c;解决你的困惑&#xff0c;甚至能改变你的命运&#xff0c;那这样的一本书你一定要视如珍宝&#xff0c;经常翻阅&#xff0c;维克多弗兰克尔的《…

右键添加git-bash

主要&#xff1a; 右键如果没有git-bash&#xff0c;如何给右键手动添加 前面对右键存在git-bash但使用出现问题的解决&#xff0c;也想到如果右键都没有&#xff0c;该如何给右键添加了&#xff0c;于是接着记录下如何添加的过程&#xff1a; 情形&#xff1a; 手动给右键添加…

Weblogic的缓存

2019独角兽企业重金招聘Python工程师标准>>> 最近遇到一个关于weblogic缓存的问题。再把war包放入到weblogic指定目录启动以后&#xff0c;访问页面信息没有更新。最后发现是\weblogic\user_projects\domains\base_domain\servers\AdminServer下的文件没有清除&…

725. 分隔链表

725. 分隔链表 给你一个头结点为 head 的单链表和一个整数 k &#xff0c;请你设计一个算法将链表分隔为 k 个连续的部分。 每部分的长度应该尽可能的相等&#xff1a;任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。 这 k 个部分应该按照在链表中出现的顺…

LAMP介绍-MySQL安装

2019独角兽企业重金招聘Python工程师标准>>> LAMP: linux-apache-mysql-php &#xff08;安装方式有&#xff1a;rpm&#xff0c;源码&#xff0c;二进制免编译&#xff09; linux-操作系统 apache-web服务软件&#xff08;httpd&#xff09; mysql-存储数据库 php…

总结verilog产生随机数的$random和seed

$random(seed)是verilog中最简单的产生随机数的系统函数。 在调用系统函数$random(seed)时&#xff0c;可以写成三种样式&#xff1a;1&#xff09;$random&#xff0c;2&#xff09;$random()&#xff0c;3&#xff09;$random(seed)。下面分别说明&#xff1a; 1&#xff09;…

326. 3的幂

326. 3的幂 给定一个整数&#xff0c;写一个函数来判断它是否是 3 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 整数 n 是 3 的幂次方需满足&#xff1a;存在整数 x 使得 n 3x 示例 1&#xff1a;输入&#xff1a;n 27 输出&#x…

Lottie 站在巨人的肩膀上实现 Android 酷炫动画效果

说到动画效果&#xff0c;一般都会感到很高端&#xff0c;感觉很酷炫&#xff1b;而小菜技术有限&#xff0c;稍复杂的动画效果也需要很多时间处理&#xff0c;但是遇到时间紧任务重的情况该怎么办呢&#xff1f;那就尝试一下 Lottie 吧&#xff0c;酷炫的动画集成却相当简单&a…