`
wojiaolongyinong
  • 浏览: 74069 次
  • 性别: 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  
 

相关推荐

    各种排序算法可视化

    **排序算法可视化** 排序算法是计算机科学中的基本概念,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序(如升序或降序)排列。本项目提供了十种不同的排序算法的可视化展示,通过C++语言实现,这有助于...

    8种排序算法可视化

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

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

    在可视化展示希尔排序的过程中,Qt是一个非常实用的工具。Qt是一个跨平台的C++图形用户界面应用程序开发框架,它可以用于创建美观且功能丰富的界面。在这个实例中,Qt被用来创建一个交互式的界面,动态显示希尔排序...

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

    这个压缩包文件"7种排序算法可视化(matlab版本).rar"包含了一个MATLAB实现的项目,它提供了对七种常见排序算法的可视化展示。这些算法包括选择排序、快速排序、希尔排序、归并排序、插入排序、冒泡排序以及猴子...

    javascipt排序算法可视化.rar

    在这个名为"javascipt排序算法可视化.rar"的压缩包中,包含了JavaScript实现的几种常见排序算法的可视化示例,如冒泡排序、选择排序、快速排序和希尔排序。 **冒泡排序**: 冒泡排序是一种基础的交换排序,它通过...

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

    此外,为了测试和验证这些排序算法的正确性,你可以编写一系列单元测试,覆盖不同情况下的输入,如已排序、逆序、随机序列等。这将确保代码的健壮性和准确性。 在实际项目中,选择合适的排序算法取决于具体的需求,...

    可视化对比十多种排序算法(C#版)源码

    这个"可视化对比十多种排序算法(C#版)源码"项目为开发者提供了一个极好的学习和比较不同排序算法的平台。C#是一种常用的编程语言,尤其在Windows应用程序和游戏开发中广泛应用,因此这个源码对C#开发者来说具有很...

    java 排序算法可视化

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

    数据结构排序算法可视化的设计.pdf

    本文将详细介绍数据结构排序算法可视化的相关知识点,具体涵盖数据结构的定义、排序算法的种类及特点,以及可视化在数据结构排序算法教学中的应用。 一、数据结构基础 数据结构是计算机存储、组织数据的方式,它...

    排序算法,MFC可视化界面

    **排序算法与MFC可视化界面** 排序算法是计算机科学中基础且重要的概念,它涉及到如何有效地组织和排列数据。在给定的项目“排序算法,MFC可视化界面”中,我们可以推断这是一个使用C++编程语言,特别是MFC...

    axina_排序算法_可视化_Axina_

    "axina_排序算法_可视化_Axina_"这个标题暗示了一个关于排序算法的项目或者工具,其中包含了对不同排序算法的可视化展示。让我们深入探讨这四种排序算法以及它们的可视化性能。 1. **冒泡排序**:冒泡排序是一种...

    基于C语言实现的多种可视化排序算法演示程序

    在本文中,我们将深入探讨如何使用C语言实现各种可视化排序算法。C语言作为一种基础且强大的编程语言,常常被用于教学和开发高效的算法。排序算法是计算机科学中的基本概念,它们帮助我们组织数据,提高查找、插入和...

    排序算法: 冒泡排序,桶排序,计数排序,堆排序,插入排序,合并排序,快速排序,基数排序,选择排序,希尔排序 实现语言: Vue

    通过创建不同的Vue组件来表示每种排序算法,可以实现动态可视化排序过程,帮助学习者直观地理解算法的工作机制。 综上所述,这个项目提供了多种排序算法的实现,结合Vue.js的特性,不仅有助于提升开发者对排序算法...

    十大常用排序算法的实现及其可视化

    本文将详细介绍十大常用的排序算法,并提供源代码实现和可视化展示,帮助读者深入理解各种排序算法的工作原理。 1. 冒泡排序(Bubble Sort) 冒泡排序是最基础的排序算法之一,通过重复遍历待排序序列,比较相邻...

    《数据结构》课程典型算法的可视化模拟论文

    1. 排序算法:如冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、堆排序等,每种排序算法都有其特定的时间复杂度和适用场景。 2. 查找算法:如线性查找、二分查找、哈希查找等,其中二分查找在有序...

    排序算法matlab仿真代码

    本文将深入探讨三种常见的排序算法——插入排序、希尔排序和快速排序,并介绍如何在MATLAB环境下进行仿真及统计它们的运算量。MATLAB是一种强大的数值计算和可视化工具,适合用于算法的开发和性能评估。 首先,我们...

    各种排序算法的FLASH演示

    这些Flash演示对于初学者来说尤其有价值,因为它们以动态、可视化的方式展示了排序算法的工作原理,有助于理解和记忆。通过观看这些演示,你可以深入理解每种算法的时间复杂度、空间复杂度以及适用场景,从而在实际...

    总结了各种排序算法,并用C++代码实现,并有演示

    本资源"总结了各种排序算法,并用C++代码实现,并有演示",提供了丰富的学习材料,包括不同类型的排序算法以及它们的C++实现,还有可能的可视化演示,帮助理解每种算法的工作原理。 首先,让我们逐一了解常见的排序...

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

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

Global site tag (gtag.js) - Google Analytics