奔走在算法的大路上(一)排序之希尔排序
希尔排序是插入排序的一种更高效的改进版本。它的作法不是每次一个元素挨一个元素的比较。而是初期选用大跨步(增量较大)间隔比较,使记录跳跃式接近它的排序位置;然后增量缩小;最后增量为 1 ,这样记录移动次数大大减少,提高了排序效率。希尔排序对增量序列的选择没有严格规定。
希尔排序最关键的是选对增量,关于增量的选择,建议参考:http://zh.wikipedia.org/wiki/希尔排序 中的步长序列。
希尔排序的核心思想是:由一定规则将带排序的长序列切割成多个子序列,子序列进行内部插入排序,如此循环。这个规则就是增量。
package Sort;public class ShellSort {/*** <p>* 是否小于* </p>* @author zhangjunshuai* @date 2015年4月3日 下午4:14:52* @param v* @param w* @return*/private static boolean less(Comparable v,Comparable w){return v.compareTo(w)<0;}/*** <p>* 交换函数* </p>* @author zhangjunshuai* @date 2015年4月3日 下午4:14:32* @param a* @param i* @param j*/private static void exch(Comparable[] a,int i ,int j){Comparable t = a[i];a[i] = a[j];a[j] = t;}/*** <p>* 打印输出* </p>* @author zhangjunshuai* @date 2015年4月3日 下午4:19:03* @param a*/private static void show(Comparable[] a){for(int i = 0; i < a.length; i++){System.out.print(a[i] + " ");}System.out.println();}/*** <p>* 希尔排序* </p>* @author zhangjunshuai* @date 2015年4月8日 下午8:51:28* @param a*/private static void Shell(Comparable[] a){int N = a.length/2;while(N>0){//增量的判断for(int i=0;i<a.length;i++){//开始循环所有数据int M = (a.length-i-1)/N;//计算i后面还有多少Nfor(int j=1;j<=M;j++){//以插入排序的方式排序增量为N的数for(int h = j;h>0;h--){if(less(a[i+h*N],a[i+(h-1)*N]))exch(a,i+h*N,i+(h-1)*N);elseh=-1;}}}System.out.println("--------------增量:"+N);show(a);N =N/2;}}public static void main(String[] args) {Integer[] a = {49,38,65,97,76,13,27,49,55,4};Shell(a);}}
结果:
第一遍内部对比的组合是(颜色相同的组合)
第二遍内部对比的组合是(颜色相同的组合)
第三遍是对相邻的进行插入的排序
参考:
http://bubkoo.com/2014/01/15/sort-algorithm/shell-sort/
奔走在算法的大路上(一)排序之希尔排序相关推荐
- 奔走在算法的大路上(一)排序之归并排序
归并排序(Merge sort)是创建在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 归并操作 归并操作(merge),也叫归并算法 ...
- 奔走在算法的大路上(一)排序之插入排序
插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-pla ...
- 奔走在算法的大路上(一)排序之选择排序
首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换).再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置.如此往复,直到 ...
- 《Algorithm算法》笔记:元素排序(2)——希尔排序
<Algorithm算法>笔记:元素排序(2)--希尔排序 Algorithm算法笔记元素排序2希尔排序 希尔排序思想 为什么是插入排序 h的确定方法 希尔排序的特点 代码 有关排序的介绍 ...
- 排序算法:冒泡排序、插入排序、选择排序、希尔排序
相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.冒泡排序: 1.算法原理: 冒 ...
- 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较
掌握好常用的排序算法,在实际的项目开发中可以节省很多的时间.每一种排序算法在执行的效率上是存在差别的,这些微小的时间差,也许在平常的联系当中感觉不到,但是涉及到数据量比较大或者是在资源比较紧张的系统中 ...
- 希尔排序python 简书_排序:希尔排序(算法)
文 | 莫若吻 (注:如果想更好的理解希尔排序,请先看看我的上一篇博客插入排序,希望会对你有帮助.) 一.简介 希尔排序(Shell Sort)是插入排序的一种算法,是对直接插入排序的一个优化,也称缩 ...
- 【数据结构与算法】高级排序(希尔排序、归并排序、快速排序)完整思路,并用代码封装排序函数
本系列文章[数据结构与算法]所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接 https://github.com/Lpyexplo ...
- 【排序算法】冒泡排序|选择排序|插入排序|希尔排序
文章目录 冒泡排序 选择排序 插入排序 希尔排序 冒泡排序 第一个元素开始向第二个元素比较,若大于则交换位置,不大于则不动.然后第二个元素和第三个元素比较,再然后第三个元素和第四个元素比较-一直比 ...
最新文章
- WMI技术介绍和应用——WMI概述
- 直博清华的小姐姐!本科就发表了SCI,享受朝九晚五的学习生活,做自己的小太阳!...
- 168 Excel Sheet Column Title
- 关于Android 构建
- 反向代理服务器(Reverse Proxy)
- 计算机自动启动无法开机,为何插上电源 电脑会自动开机 但是又开不起来
- ios 字符串转数组_ES6中常用的数组操作-必须收藏
- Drainage Ditches - poj 1273(网络流模板)
- cuda矩阵相乘_cuda初学(1):稀疏矩阵向量乘法(单精度)
- vim替换字符串带斜杠_Linux vi/vim最全使用指南
- java 金额_货币金额的计算 - Java中的BigDecimal
- php中echo和print的区别
- 【TWVRP】基于matlab粒子群算法求解带时间窗的车辆路径规划问题【含Matlab源码 334期】
- Google Earth 嵌入Qt应用程序
- 《西方哲学史》阅读笔记
- 看傲腾配OpenCAS加速联通沃云业务
- JavaScript有关this指向问题,如何修改this指向
- 大连埃森哲Java面试题
- 超详细!Vue-coderwhy个人学习笔记(二)(Day3)
- JXTA技术与应用发展
热门文章
- 掉价最快的手机排行榜_目前掉价最快的三款华为麒麟980旗舰机,最低仅2799元...
- java 模拟键盘输入_Java 在windows 下模拟鼠标键盘的输入
- android qq密码,怎么用手机改qq密码
- 在线计算机励志文案,励志文案短句 适合发朋友圈的正能量语录
- c# windows窗体 显示pdf ChromiumWebBrowser插件
- Android开发之MVVM模式实践(六),2021字节跳动春招技术面试题
- 2022-2027年中国机械键盘行业市场深度分析及投资战略规划报告
- 360浏览器安装扩展程序
- AutowareAuto泊车案例复现及原理简介
- 能听懂口音的开源语音系统来了:OpenAI出品,支持99种语言,英文识别能力直逼人类...