《Algorithm算法》笔记:元素排序(2)——希尔排序
《Algorithm算法》笔记:元素排序(2)——希尔排序
有关排序的介绍,看上一个笔记:《Algorithms算法》笔记:元素排序(1)——简单排序
希尔排序是这是本课程中出现的第一个非平凡的排序算法。
希尔排序思想
希尔的思想也很简单就是一个h-sort的插入算法——每相邻h个元素进行插入排序
为什么是插入排序?
- 如果h比较大,那么子数组会很小,用插入效率高
- 如果h很小,这时候数组基本有序,插入效率高
h的确定方法:
一般常用的是 : h=3h+1 ——兼顾奇偶
希尔排序的特点:
简单的想法却导致巨大的性能收益!
- 在实际使用中,对于不是特别大的数组,排序速度快。
- 代码量小(可用与嵌入式中)
- 硬件类算法原型
- 通过找更好的递增数列可以有更好的性能提升(这是一个新的课题)
代码:
public class Shell{
public static sort(Comparable[] a)
{
int N = a.length();
int h = 1;
while(h < N/3) //找比n小的最大h
h = 3*h+1;
do{
for(i = h;i < N; i++)
{
for(j = i;j >= h && less(a[j],a[j-h]);j -= h)
exch(a,a[j],a[j-h]);
}
h = h/3; //由于是取整操作所以h/3 == (h-1)/3
}while(h > 1)
}
}
注意: 这里的循环
for(i = h;i < N; i++)
for(j = i;j >= h && less(a[j],a[j-h]);j -= h)
是用的i从前往后,j从后往前。j也可以用从前往后
for(i = 0;i < N-h; i++)
for(j = i;j + h < N && less(a[j+h],a[j]);j += h)
《Algorithm算法》笔记:元素排序(2)——希尔排序的更多相关文章
- java排序算法(八):希尔排序(shell排序)
java排序算法(八):希尔排序(shell排序) 希尔排序(缩小增量法)属于插入类排序,由shell提出,希尔排序对直接插入排序进行了简单的改进,它通过加大插入排序中元素之间的间隔,并在这些有间隔的 ...
- javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)
javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...
- 算法笔记(c++)--桶排序题目
算法笔记(c++)--桶排序 记得题目是排序,输入n个1-1000的数字然后去重然后排序. 桶排序没毛病 #include<iostream> using namespace std; i ...
- 插入排序与shell排序(希尔排序)
1 .插入排序的过程如同我们平时打扑克牌取牌插入的过程,不断将取出的扑克牌插入已经排好的地方. 插入排序过程初始有序区间大小为1,取出无序区间的首元素,查找有序区间的合适位置,进行插入.不断重复上述过 ...
- 插入排序、冒泡排序、选择排序、希尔排序、高速排序、归并排序、堆排序和LST基数排序——C++实现
首先是算法实现文件Sort.h.代码例如以下: <pre name="code" class="java">/* * 实现了八个经常使用的排序算法: ...
- 内部排序->插入排序->希尔排序
文字描述 希尔排序又称缩小增量排序,也属于插入排序类,但在时间效率上较之前的插入排序有较大的改进. 从之前的直接插入排序的分析得知,时间复杂度为n*n, 有如下两个特点: (1)如果待排序记录本身就是 ...
- 学习C#之旅 冒泡排序,选择排序,插入排序,希尔排序[资料收集]
关于冒泡排序,选择排序,插入排序,希尔排序[资料收集] 以下资料来源与网络 冒泡排序:从后到前(或者从前到后)相邻的两个两两进行比较,不满足要求就位置进行交换,一轮下来选择出一个最小(或最大)的放到 ...
- 算法(第四版)学习笔记之java实现希尔排序
希尔排序思想:使数组中随意间隔为h的元素都是有序的. 希尔排序是插入排序的优化.先对数组局部进行排序,最后再使用插入排序将部分有序的数组排序. 代码例如以下: /** * * @author seab ...
- [Swift]八大排序算法(六):希尔排序
排序分为内部排序和外部排序. 内部排序:是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列. 外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存 ...
随机推荐
- java程序无法启动:Unsupported major.minor version 51.0
今天在sae上部署了一个项目,结果总是出现503错误:service unavailable,然后jvm出现了一大串错误日志,如下 JAVA_SAE_Fatal_error: Failed start ...
- 咏南CS开发框架新的界面风格
咏南CS开发框架新的界面风格 这种风格完全和WINDOWS桌面一样,符合用户的操作习惯. 我的桌面的图标和WINDOWS桌面一样分为二类:1)快捷方式 2)文件夹. 如果快捷方式较多,看得人眼花缭乱 ...
- SQL Server触发器的基本使用
sqlserver_SQL触发器的使用及语法(转自:百度文库) 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程 ...
- Android-SqliteSQL语句大全
SqliteSQL语句大全 创表语句: create table student_table(_id integer primary key autoincrement, name text, age ...
- [Erlang33]使用recon从网页查看Erlang运行状态
0.需求分析 Erlang最好的卖点之一就是提供了一个非常强大的shell来查看Node运行时的各种状态,可以进行各种各样的内部查看,在运行时调试和分析,热更新代码. 但是总有一些在生产环境下要慎 ...
- div自适应宽度
对于div自适应宽度,网上的说法基本上都是将要自适应宽度的div放在其它固定宽度的最后,不指定其float属性或将float属性指定为none,比如三栏布局居中的一栏为自适应宽度,就可以这样来定义三栏 ...
- asp.net 类头部描述
这里教大家怎么在新建类的时候默认有头部描述,先看效果: 像这样的内容我们要怎么进行添加呢? 前方高能...... 找到VS的安装目录-->比如我自己的安装目录D:\VS2013\Common7\ ...
- 关于My Sql update语句不能用子查询的解决办法
在使用My Sql数据库语法操作update时,第一时间想到的是一下写法: UPDATE purchase_request_detail SET convert_to_voucher_id=, con ...
- roadflow企业微信工作流程的配置与使用
1.在您的微信后台添加应用 应用地址: 待办事项 :http://demo.roadflow.net/RoadFlowCore/Mobile/WaitTask 已办事项:http://demo.roa ...
- 基于SSH的客户关系管理系统CRM-JavaWeb项目-有源码
开发工具:Myeclipse/Eclipse + MySQL + Tomcat 项目简介: 项目的编译和运行:1 将数据库导入MysSql里 :打开HeidiSql这个图形化工具,新建一个数据库, 可 ...