希尔排序Shell_Sort
概述:听到希尔排序这个名称,心里完全没有任何概念,因为这个名称不能给你提供任何有效的信息。但是它的名字又是那么的特殊,以至于学习过数据结构排序的都知道这种方法的存在。现在我们就来看一下所谓的希尔排序。
希尔排序是一种先进排序的算法,先进排序算法是指时间复杂度比简单排序更进一步的排序算法,除希尔排序之外,还有归并排序,快速排序,堆排序等。它的思想来源于插入排序,只不过是把数组分为若干组分别进行排序。
例如一个数组{49,38,65,97,76,13,27,55,4},首先设置一个增量序列数组{3,2,1},第一步设置gap为3,将数组分为3组,分别是{49,97,27},{38,76,55},{65,13,4},然后分别做插入排序,变为{27,49,97},{38,55,76},{4,13,65},然后再把它们组合起来,变为{27,38,4,49,55,13,97,76,65}。如下所示相同颜色为一组,每组分别进行排序【指插入排序】,然后形成一次排序,图中下面的数据即是一次排序的结果。接着gap改成数组中的第二个元素2,即分为2组,分别是{27,4,55,97,65}和{38,49,13,76},最后进行gap设置为1进行排序,形成有序数组。

时间复杂度:关于希尔排序的时间复杂是一个复杂的问题,它与选取的增量序列数组有关,但是现在尚未有人能够给出一种最好的增量序列方法,涉及到一些数学上尚未解决的难题。
如何选取增量序列:可以有各种取法,但应使增量序列中的值没有除1以外的公因子,并且最后一个增量值应为1.
代码:
public class Shell_Sort {
static void insertion(int [] a, int d)
{
for(int l = 0; l < d; l++) {
for (int i = d+l; i < a.length; i += d) {
int sen = a[i];
int j = i - d;
for (; j >= 0; j -= d) {
if (a[j] > sen)
a[j + d] = a[j];
else {
break;
}
}
a[j + d] = sen;
}
}
for (int n:a)
System.out.print(n+" ");
System.out.println();
}
public static void main(String []args)
{
int [] d = {3,2,1};
int [] a = {49,38,65,97,76,13,27,55,4};
for (int k = 0; k < d.length; k++)
{
insertion(a,d[k]);
}
}
}
结果:
27 38 4 49 55 13 97 76 65
4 13 27 38 55 49 65 76 97
4 13 27 38 49 55 65 76 97
希尔排序Shell_Sort的更多相关文章
- python算法与数据结构-希尔排序算法(35)
一.希尔排序的介绍 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是把记录按下标的一定增量分组,对每 ...
- 算法----希尔排序(shell sort)
在分析插入排序(插入排序算法实现)的算法性能的过程时知道.当数组规模较小或者存在较多的有序子序列时.插入排序将会在非常短的时间内完毕数组的排序,为此能够设计一个单调序列h[n],将数组分为多个小的序列 ...
- 基于visual Studio2013解决面试题之1404希尔排序
题目
- python实现排序算法 时间复杂度、稳定性分析 冒泡排序、选择排序、插入排序、希尔排序
说到排序算法,就不得不提时间复杂度和稳定性! 其实一直对稳定性不是很理解,今天研究python实现排序算法的时候突然有了新的体会,一定要记录下来 稳定性: 稳定性指的是 当排序碰到两个相等数的时候,他 ...
- python数据结构与算法第十一天【希尔排序】
1.希尔排序的原理 2.代码实现 def shell_sort(alist): n = len(alist) # 初始步长 gap = n / 2 while gap > 0: # 按步长进行插 ...
- Python排序算法——希尔排序(Shell’s Sort)
有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10793487.html 一.希尔排序(Shel ...
- 希尔排序算法的php实现
虽然现在各种程序语言都有其各自强大的排序库函数,但是这些底层实现也都是利用这些基础或高级的排序算法. 理解这些复杂的排序算法还是很有意思的,体会这些排序算法的精妙~ 一.希尔排序(shell sort ...
- 希尔排序之python
希尔排序( Shell sort) 插入排序的改进版本,其核心思想是将原数据集合分割成若干个子序列,然后再对子序列分别进行直接插入排序,使子序列基本有序,最后再对全体记录进行一次直接插入排序. 我的面 ...
- python算法之希尔排序
希尔排序 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出而得名. 希尔 ...
随机推荐
- PyCharm Community Edition编辑Python查看数据库
描述:利用PyCharm Community Edition社区版本的时候无法查看数据库 解决方法如下: 点击File之后选择setting 点击setting之后出现的画面上面选择Plugins,之 ...
- 自定义Hive函数
7. 函数 7.1 系统内置函数 查看系统自带的函数:show functions; 显示自带的函数的用法:desc function upper(函数名); 详细显示自带的函数的用法:desc fu ...
- [官网]Windows 10 版本信息
对应于服务选项的 Windows 10 当前版本 https://docs.microsoft.com/zh-cn/windows/release-information/ 所有的日期都按照 ISO ...
- “无法改变的设计”——浅谈Java中的final关键字
在Java中,final关键字可以用来修饰类.变量(包括成员变量和局部变量).方法,下面从这三个方面分别说明. final方法 当一个方法被final修饰时,表明这个方法不能被子类重写. 下面程序试图 ...
- 2019ICPC南昌网络赛总结
打的很崩的一场比赛.上来签到题我就wa了一发,感觉在梦游.然后我开了H题,队友开B题,f(n)=3f(n-1)+2f(n)傻子都知道矩阵快速幂,但是1e7的强制在线必须把logn优化,然后试图打表寻找 ...
- 斜率优化dp学习笔记 洛谷P3915[HNOI2008]玩具装箱toy
本文为原创??? 作者写这篇文章的时候刚刚初一毕业…… 如有错误请各位大佬指正 从例题入手 洛谷P3915[HNOI2008]玩具装箱toy Step0:读题 Q:暴力? 如果您学习过dp 不难推出d ...
- ThinkPHP读取配置信息
use think\Config; dump(Config::get()); // 或者 dump(config());示例:dump(Config::get('database.database') ...
- MySQL的sql语言分类DML、DQL、DDL、DCL
SQL语言一共分为4大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL 1.数据定义语言DDL(Data Definition Language) 对象: 数据库和表 ...
- 笔记-6:mysql索引
1.索引概述 建立索引的目的:加快数据库检索的速度. mysql中索引主要分为: 普通索引:使用index或key关键字创建,其索引列值可以取空值或重复值. 唯一性索引:使用关键字UNIQUE创建,其 ...
- Django 关联查询
查询id=1的XXXXX关联的YYYYY信息 a = XXXXX.objects.get(id=1) a.YYYYY.all() 查询id=1的YYYYY关联的XXXXX信息 b = YYYYY.ob ...