作为初学者,看到书中希尔算法部分,完全不知道书上的内容是写的什么,一个个N,K,J等符号,看的我如坠入云中,不知所云。书上的推导过程更加让我迷惑,根本不知道数与数之间是如何产生关系的。

于是我上网搜索关于希尔排序的文章,大部分文章写几句关键点并把实现代码写出来就没有了,而且语言晦涩难懂,本来就不理解什么是希尔排序,看到这样的文章更加迷惑。

翻看的多篇文章之后,终于找到了一篇适合我看的文章-

白话经典算法系列之三 希尔排序的实现(http://blog.csdn.net/morewindows/article/details/6668714)

作者通过一个数组例子,详细的分析了希尔排序代码的执行过程,并给出了不同简化程度的源代码。说了这么多,好像是做广告了。呵呵,反正我是看这篇文章,学会了希尔排序。

package it.cast.sort;

public class Shellsort {
    // 希尔算法(shell)核心思想:

/*
     * 将一组比较长多的数按照一定的 数学公式进行分组(有很多分组方法,没有定论,这里选用gap=gap/2的分组方法,但是最后一个gap必须等于1)
     * 分组结束后,在组内进行插入算法排序。每进行一次分组,就进行一次插入排序。当gap=1进行分组并排序完成后 shell算法整体结束
     */

// 建议按照代码手动推导几个循环,观察推导过程,这样做便于理解代码的含义。

// 最容易理解,最直观的希尔排序

  public static void shellsort1(int[] a) {for (int gap = a.length / 2; gap > 0; gap /= 2) {for (int i = 0; i < gap; i++) {for (int j = gap+i; j < a.length; j += gap) {if (a[j] < a[j -gap]){int temp = a[j]; int k = j - gap;for (; k >= 0 &&a[k] > temp; k -= gap) {
a[k + gap] = a[k]; }
a[k + gap] = temp; } }//  插入算法}}}

// 经过简化的shell算法

 public static void shellsort2(int[] a) {for (int gap = a.length / 2; gap > 0; gap /= 2) {for (int i = gap; i < a.length; i++) {if (a[i] < a[i - gap]) {int temp = a[i];int k = i - gap;for (; k >= 0 && a[k] > temp; k -= gap) {a[k + gap] = a[k];}a[k + gap] = temp;}}}}

// 更加简介的算法(将直接插入算法改为了冒泡算法)

 public static void shellsort3(int[] a) {for (int gap = a.length / 2; gap > 0; gap /= 2) {for (int i = gap; i < a.length; i++) {for (int k = i - gap; k >= 0 && a[k] > a[k + gap]; k -= gap)/** 将插入算法改为了冒泡算法 , 即相邻之间的数据进行比较 , 如果前面的数据大于后边的数据 , 然后进行位置交换*/{int t = a[k + gap];a[k + gap] = a[k];a[k] = t;}}}}

//测试

  public static void main(String[] arge) {int a[] = { 1, 4, 3, 2, 6, 5, 43, 6, 6, 8, 90, 5, 64, 4, 65, 445, 3,4343, 3432211, 12, 211, 12 };// 统计所用时间double begin = System.currentTimeMillis(); // 这段代码放在程序执行前for (int i = 0; i < 100000; i++) {// shellsort(a);// shellsort(a);shellsort1(a);// shellsort2(a);// shellsort3(a);}double end = System.currentTimeMillis() - begin; // 这段代码放在程序执行后System.out.println("耗时:" + end + "毫秒");//遍历数组中的数字for (int i = 0; i < a.length; i++) {System.out.println(a[i]);}}
}

希尔(Shell sort)算法相关推荐

  1. C语言实现希尔排序shell sort算法之一(附完整源码)

    希尔排序shell sort算法 希尔排序shell sort算法的完整源码(定义,实现,main函数测试) 希尔排序shell sort算法的完整源码(定义,实现,main函数测试) #includ ...

  2. C语言实现希尔排序shell sort算法之二(附完整源码)

    希尔排序shell sort算法 希尔排序shell sort算法的完整源码(定义,实现,main函数测试) 希尔排序shell sort算法的完整源码(定义,实现,main函数测试) #includ ...

  3. 图解希尔排序——希尔排序算法(shell sort)

    希尔排序 shell sort 算法图解 算法实现(C语言) 算法分析 希尔排序又叫缩小增量排序,它是对直接插入排序算法的一种改进.希尔排序算法的基本思想是先将整个待排序的序列划分为若干个子序列,然后 ...

  4. C++shell sort希尔排序的实现算法之二(附完整源码)

    C++shell sort希尔的实现算法 C++shell sort希尔的实现算法完整源码(定义,实现,main函数测试) C++shell sort希尔的实现算法完整源码(定义,实现,main函数测 ...

  5. C++shell sort希尔排序的实现算法之一(附完整源码)

    C++shell sort希尔排序的实现算法 C++shell sort希尔排序的实现算法完整源码(定义,实现,main函数测试) C++shell sort希尔排序的实现算法完整源码(定义,实现,m ...

  6. 经典排序算法 - 希尔排序Shell sort

    经典排序算法 - 希尔排序Shell sort 希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第 ...

  7. 排序算法研究之希尔排序(shell sort)

    前面几个小节,我们分别介绍了冒泡排序,插入排序,直接快速排序 ,选择排序本节,我们介绍插入排序的改进版的希尔排序. 希尔排序是1959年,Shell发明的,这是第一个突破O(n2)的排序算法,他与直接 ...

  8. Shell Sort 希尔排序 收藏

    Shell Sort 希尔排序 收藏 希尔排序(Shell Sort)又叫做缩小增量排序(diminishing increment sort),是一种很优秀的排序法,算法本身不难理解,也很容易实现, ...

  9. 排序 —— 希尔排序(Shell sort)

    希尔排序(Shell sort)的名称源于它的发明者 Donald Shell,该算法是冲破二次时间屏障(冒泡和插入排序,基于相邻元素的交换)的第一批算法.希尔排序改进了冒泡和插入排序的相邻元素才进行 ...

最新文章

  1. Json对象和Json字符串
  2. 仓库货位卡标识牌_仓储管理中的货位与标识管理
  3. Google更新最大的带注释图像数据集,添加本地化叙述
  4. flutter加载本地html标签,Flutter中如何加载并预览本地的html文件的方法
  5. SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(可监控)
  6. matlab 并联机械臂_MATLAB robot toolbox 机械臂轨迹规划
  7. 两个排序数组的中位数
  8. Unmarshaller解析xml文件
  9. Mybatis、使用注解的方式编写用户和角色一对多关系,并使用延迟加载
  10. 纯css3实现的鼠标悬停动画按钮
  11. Linux内核锁实现原理,linux 大内核锁原理
  12. delphi 更改DBGrid 颜色技巧
  13. java swing web_Java-JFrame-swing嵌套浏览器步骤
  14. vim xxd命令查看二进制文件内容
  15. JavaScript 颜色梯度和渐变效果
  16. 缓存淘汰算法 LRU
  17. python 详解re模块
  18. Grails枚举一例
  19. 常用PDF文档开发库
  20. Linux基础(三)

热门文章

  1. 【Mib自看】黑魂复刻Unity脚本
  2. 海泰方圆精彩亮相第六届中国人工智能与大数据海南高峰论坛
  3. 民生银行网银汇款|同城本行汇款|异地本行汇款|异地他行汇款
  4. Android 好用导航卡框架
  5. Cython (pyx)
  6. Kubernetes 基本概念和部署
  7. 机器学习的数学基础(下)
  8. office打开对象提示:不能启动此对象的源应用程序
  9. 黄冈中学2021高考成绩查询,2021年黄冈高考状元名单公布 今年黄冈高考状元是谁资料和分数...
  10. 屏下指纹识别迅速普及,凸显国产手机缺乏核心技术