`
wojiaolongyinong
  • 浏览: 72975 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

算法可视化系列——排序算法——希尔排序

阅读更多

排序算法可视化系列——篇三“希尔排序”

 

希尔排序

 

基本思想分析:

在我的第一个排序算法可视化中,分析了插入排序,但是我们知道,对于数组尺

度比较大的,并且无序度很大,那么使用直接插入排序比较相邻的元素,然后进行排

序,这样做很麻烦。但是如果数组的无序度不是很大的话,那么插入排序就很好了,

比如说我们可以分析两种情况,一种最为糟糕的情况是使用插入排序时,每次都需要

交换,这样就达到了最坏的时间复杂度O(n^2);另外一种是最理想的情况,既就是,

数组在排序之前就是有序的了,那么我们根本就不需要进行排序;所以为了避免大数

组且无序度很大的情况下插入排序的缺点,希尔改进了插入排序,将每次比较的不是

相邻元素,而是对于有等间隔索引的数组元素子列进行插入排序,然后减小间隔,再

对子列进行排序,直到间隔为1时就是对于整个数组的插入排序,但是经过前面对于

子列的插入排序,整个数组已经基本有序,所以会提高效率,而且希尔建议第一次选

取间隔时,选择数组长度的一半,然后每次减半,直到间隔为1,就是对整个数组进行

插入排序。(注意:选间隔时,最好选为奇数,不要选为偶数,因为加入第一次选4,

下一次变为一半2时,进行排序时,会重复上一次的元素,所以选奇数的话就不会出现

这种情况)

 

算法描述:

//假设是对最简单的整数类型数组进行排序

public static void AlgorithmShellSort(int[] a){

        首先得到数组的长度n

        然后进行循环直到间隔长度为1

        for(初始值从n的一半开始,每次循环变为上一次的一半){

               判断是否为偶数间隔,如果是,给间隔加一或是减一都可以

//对每个子列都进行排序

for(对于间隔进行循环,因为间隔为多大,就说明有几个子列){

for(从子列i的i + step初始位置开始,每次增加step直到小于数组长度){

记录此刻需要进行插入的元素及位置索引

while(进行位置移动)的判断{

移动元素将index位置元素移动到index + 1上

}

已经找到了合适位置,插入上面选择的元素

}

}

        }

}

 

从上面的算法描述中可以看出使用了那么多循环,但是事实证明希尔排序速度还是很

快的,如果按照上面说的每次选取间隔时,均选取为奇数,那么希尔排序的最坏情况

下时间复杂度为O(n^1.5),整个时间复杂度在n~n^1.5之间。

 

算法Java的基本实现:

 

/**
* 希尔排序的基本实现
* 在整型数组上的基本实现
*
*/
public static void shellSort(int[] a){
  int n = a.length;
  /**
  * 间隔的选取,进行循环选取,直到step为1
  */
  for(int step = n/2; step > 0; step /= 2){
    /**
    * 将step改变为奇数
    */
    if(step % 2 == 0){
      step += 1;
    }
    /**
    * 对子列进行循环排序
    */
    for(int i = 0; i < step; i++){
      /**
      * 对子列进行插入排序
      */
      for(int j = i + step; j < a.length; j += step){
        int temp_data = a[j];
        int index = j - 1;
        while(index >= 0 && temp_data < a[index]){
          a[index + 1] = a[index];
          index--;
        }
        /**
        * 找到插入位置
        */
        a[index + 1] = temp_data;
      }
    }
  }
}

 

 上面是对希尔排序的基本实现,主要用来体会希尔排序的主要思想,下面是对希尔排序的动态演示......

 

一、 排序中......

 

 

 二、 子列插入排序......



 三、排好序。




 
以上就是对希尔排序的可视化演示,具体源代码附录如下,仅附录ShellSort部分:


 
 

  • 大小: 32.2 KB
  • 大小: 29.8 KB
  • 大小: 30.2 KB
分享到:
评论
3 楼 wojiaolongyinong 2013-05-21  
消失的气泡 写道
博主,你在这个篇文章中贴的代码有问题的,我帮改了下!
public static void shellSort(int[] a){
	  int n = a.length;
	  /**
	  * 间隔的选取,进行循环选取,直到step为1
	  */
	  for(int step = n/2; step > 0; step /= 2){
	    /**
	    * 将step改变为奇数
	    */
	    if(step % 2 == 0){
	      step += 1;
	    }
	    System.out.println("=========="+step);
	    /**
	    * 对子列进行循环排序
	    */
	    for(int i = 0; i < step; i++){
	      /**
	      * 对子列进行插入排序
	      */
	      for(int j = i + step; j < a.length; j += step){
	        int temp_data = a[j];
	        int index = j - step;
	        while(index >= 0 && temp_data < a[index]){
	          a[index + step] = a[index];
	          index = index -step;
	        }
	        /**
	        * 找到插入位置
	        */
	        a[index + step] = temp_data;
	        for(int v =0;v<a.length;v++){
	        	System.out.print(a[v]+",");
	        }
	        System.out.println("");
	      }
	    }
	  }
	}


如果看这篇博客的朋友想更直观了解希尔排序,请点这个,这是个希尔排序的动画
[url]
http://student.zjzk.cn/course_ware/data_structure/web/flashhtml/shell.htm
[/url]

奥。。。。我发现了。。。。我的失误。。。。谢谢哈
2 楼 消失的气泡 2013-05-21  
博主,你在这个篇文章中贴的代码有问题的,我帮改了下!
public static void shellSort(int[] a){
	  int n = a.length;
	  /**
	  * 间隔的选取,进行循环选取,直到step为1
	  */
	  for(int step = n/2; step > 0; step /= 2){
	    /**
	    * 将step改变为奇数
	    */
	    if(step % 2 == 0){
	      step += 1;
	    }
	    System.out.println("=========="+step);
	    /**
	    * 对子列进行循环排序
	    */
	    for(int i = 0; i < step; i++){
	      /**
	      * 对子列进行插入排序
	      */
	      for(int j = i + step; j < a.length; j += step){
	        int temp_data = a[j];
	        int index = j - step;
	        while(index >= 0 && temp_data < a[index]){
	          a[index + step] = a[index];
	          index = index -step;
	        }
	        /**
	        * 找到插入位置
	        */
	        a[index + step] = temp_data;
	        for(int v =0;v<a.length;v++){
	        	System.out.print(a[v]+",");
	        }
	        System.out.println("");
	      }
	    }
	  }
	}


如果看这篇博客的朋友想更直观了解希尔排序,请点这个,这是个希尔排序的动画
[url]
http://student.zjzk.cn/course_ware/data_structure/web/flashhtml/shell.htm
[/url]
1 楼 kyolxs 2013-05-21  
 

相关推荐

    8种排序算法可视化

    八种排序算法分别是: 1.冒泡排序; 2.选择排序; 3.插入排序; 4.快速排序; 5.归并排序; 6.希尔排序; 7.二叉排序; 8.计数排序; 其中快排尤为重要,几乎可以说IT开发类面试必考内容,而希尔排序和归并...

    可视化展示希尔排序算法实现效果

    该源码使用Qt可以可视化展示希尔排序算法实现效果,通过可视化的方式和实时显示算法比较和移动的次数,方便初学者理解希尔排序算法的时间复杂度和原理

    7种排序算法可视化(matlab版本).rar

    程序实现选择,快速,希尔,归并,插入,冒泡,猴子算法的排序可视化,有助于理解各排序算法的排序过程,直观看出算法的优劣。

    java 排序算法可视化

    用java做的一个小的排序算法演示程序,用线程控制访问,共7个算法,包括冒泡,选择,希尔,插入,归并,堆,快排。。

    javascipt排序算法可视化.rar

    包含冒泡排序、选择排序、快速排序、希尔排序等排序的可视化,javascript实现,使用了类的实现方式,具有动画演示。

    基于Qt5-实现九大排序算法的代码汇总

    本项目用C++中实现了冒泡排序、插入排序、堆排序、希尔排序、归并排序、基数排序、选择排序、桶排序、快速排序

    重庆理工大学数据结构实验报告+源码+实验数据 内部排序算法的性能分析详尽分析了不同排序算法的优劣,并有20张可视化图对比。

    ⑴ 编程实现内部排序算法:编程实现直接插入排序,希尔排序,冒泡排序,快速排序,简单选择排序,堆排序,归并排序算法。 ⑵ 要求数据规模:待排序数据类型不限(整型或浮点型),读取自磁盘文件。需用多组、多规模...

    算法第四版-PDF-网盘链接

     2.1.4 排序算法的可视化 159  2.1.5 比较两种排序算法 159  2.1.6 希尔排序 162  2.2 归并排序 170  2.2.1 原地归并的抽象方法 170  2.2.2 自顶向下的归并排序 171  2.2.3 自底向上的归并排序...

    各种排序算法.rar

    直接插入排序、折半插入排序,起泡排序、快速排序、选择排序、堆排序,基数排序,归并排序,希尔排序,可视化界面,MFC

    《算法》中文版,Robert Sedgewick,塞奇威克

    2.1.4 排序算法的可视化 2.1.5 比较两种排序算法 2.1.6 希尔排序 2.2 归并排序 2.2.1 原地归并的抽象方法 2.2.2 自顶向下的归并排序 2.2.3 自底向上的归并排序 2.2.4 排序算法的复杂度 2.3 快速排序 2.3.1...

    算法-第4版-完整版

    2.1.4 排序算法的可视化 159 2.1.5 比较两种排序算法 159 2.1.6 希尔排序 162 2.2 归并排序 170 2.2.1 原地归并的抽象方法 170 2.2.2 自顶向下的归并排序 171 2.2.3 自底向上的归并排序 175 ...

    算法 第4版 高清中文版

    2.1.4 排序算法的可视化 159 2.1.5 比较两种排序算法 159 2.1.6 希尔排序 162 2.2 归并排序 170 2.2.1 原地归并的抽象方法 170 2.2.2 自顶向下的归并排序 171 2.2.3 自底向上的归并排序 175 2.2.4 排序算法的...

    算法 第4版-谢路云译-带完整书签

    2.1.4 排序算法的可视化 159 2.1.5 比较两种排序算法 159 2.1.6 希尔排序 162 2.2 归并排序 170 2.2.1 原地归并的抽象方法 170 2.2.2 自顶向下的归并排序 171 2.2.3 自底向上的归并排序 175 2.2.4 ...

    MFC_MULTIVIEW_SORT.zip

    1、编程要求 1) 动态生成自定义大小的数组,并以随机数初始化数组。 2) 按“开始”菜单演示数组数据排序的移动过程,按“结束”菜单结束排序演示过程。 3) 在客户区正确显示当前数组数据...3) 可视化地显示每一步。

    MFC排序算法

    MFC可视化排序小程序,含源代码,可编辑

    第10讲 基于流程图仿真的可视化计算工具:Raptor.pptx

    枚举算法,递归与分治策略,递归与迭代的思想、求最大值最小值、线性查找、二分查找与冒泡排序以及选择与交换排序、插入和希尔排序。本课程除了强调经典的算法理论和模型,亦兼顾编程实践能力。力图使得学员面对复杂...

    算法,4th,塞奇威克 (Robert Sedgewick)韦恩 (Kevin Wayne), 谢路云 译.azw3

    2.1.4 排序算法的可视化 2.1.5 比较两种排序算法 2.1.6 希尔排序 2.2 归并排序 2.2.1 原地归并的抽象方法 2.2.2 自顶向下的归并排序 2.2.3 自底向上的归并排序 2.2.4 排序算法的复杂度 2.3 快速排序 2.3.1 ...

    leetcode题库-Algorithm:算法

    leetcode题库 Algorithm Algorithm 学习到的算法 排序算法 冒泡排序 简单选择排序 直接插入排序 希尔排序 堆排序 归并排序 快速排序 基数排序 寻路算法 ...五大常用算法 五大常用算法之一:...可视化的数据结构学习网站

    MFC_SORT_CODE.zip

    1、编程要求 1) 动态生成自定义大小的数组,并以随机数初始化数组。 2) 按“开始”菜单演示数组数据排序的移动过程,按“结束”菜单结束排序演示过程。 3) 在客户区正确显示当前数组数据...3) 可视化地显示每一步。

Global site tag (gtag.js) - Google Analytics