排序算法可视化系列——篇三“希尔排序”
希尔排序
基本思想分析:
在我的第一个排序算法可视化中,分析了插入排序,但是我们知道,对于数组尺
度比较大的,并且无序度很大,那么使用直接插入排序比较相邻的元素,然后进行排
序,这样做很麻烦。但是如果数组的无序度不是很大的话,那么插入排序就很好了,
比如说我们可以分析两种情况,一种最为糟糕的情况是使用插入排序时,每次都需要
交换,这样就达到了最坏的时间复杂度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部分:
相关推荐
**排序算法可视化** 排序算法是计算机科学中的基本概念,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序(如升序或降序)排列。本项目提供了十种不同的排序算法的可视化展示,通过C++语言实现,这有助于...
内部排序算法可视化:冒泡排序、快速排序、直接插入排序、折半插入排序、希尔排序、简单选择排序、堆排序、_Vue
八种排序算法分别是: 1.冒泡排序; 2.选择排序; 3.插入排序; 4.快速排序; 5.归并排序; 6.希尔排序; 7.二叉排序; 8.计数排序; 其中快排尤为重要,几乎可以说IT开发类面试必考内容,而希尔排序和归并...
在可视化展示希尔排序的过程中,Qt是一个非常实用的工具。Qt是一个跨平台的C++图形用户界面应用程序开发框架,它可以用于创建美观且功能丰富的界面。在这个实例中,Qt被用来创建一个交互式的界面,动态显示希尔排序...
这个压缩包文件"7种排序算法可视化(matlab版本).rar"包含了一个MATLAB实现的项目,它提供了对七种常见排序算法的可视化展示。这些算法包括选择排序、快速排序、希尔排序、归并排序、插入排序、冒泡排序以及猴子...
在这个名为"javascipt排序算法可视化.rar"的压缩包中,包含了JavaScript实现的几种常见排序算法的可视化示例,如冒泡排序、选择排序、快速排序和希尔排序。 **冒泡排序**: 冒泡排序是一种基础的交换排序,它通过...
这个"可视化对比十多种排序算法(C#版)源码"项目为开发者提供了一个极好的学习和比较不同排序算法的平台。C#是一种常用的编程语言,尤其在Windows应用程序和游戏开发中广泛应用,因此这个源码对C#开发者来说具有很...
用java做的一个小的排序算法演示程序,用线程控制访问,共7个算法,包括冒泡,选择,希尔,插入,归并,堆,快排。。
本文将详细介绍数据结构排序算法可视化的相关知识点,具体涵盖数据结构的定义、排序算法的种类及特点,以及可视化在数据结构排序算法教学中的应用。 一、数据结构基础 数据结构是计算机存储、组织数据的方式,它...
此外,为了测试和验证这些排序算法的正确性,你可以编写一系列单元测试,覆盖不同情况下的输入,如已排序、逆序、随机序列等。这将确保代码的健壮性和准确性。 在实际项目中,选择合适的排序算法取决于具体的需求,...
**排序算法与MFC可视化界面** 排序算法是计算机科学中基础且重要的概念,它涉及到如何有效地组织和排列数据。在给定的项目“排序算法,MFC可视化界面”中,我们可以推断这是一个使用C++编程语言,特别是MFC...
"axina_排序算法_可视化_Axina_"这个标题暗示了一个关于排序算法的项目或者工具,其中包含了对不同排序算法的可视化展示。让我们深入探讨这四种排序算法以及它们的可视化性能。 1. **冒泡排序**:冒泡排序是一种...
在本文中,我们将深入探讨如何使用C语言实现各种可视化排序算法。C语言作为一种基础且强大的编程语言,常常被用于教学和开发高效的算法。排序算法是计算机科学中的基本概念,它们帮助我们组织数据,提高查找、插入和...
通过创建不同的Vue组件来表示每种排序算法,可以实现动态可视化排序过程,帮助学习者直观地理解算法的工作机制。 综上所述,这个项目提供了多种排序算法的实现,结合Vue.js的特性,不仅有助于提升开发者对排序算法...
本文将详细介绍十大常用的排序算法,并提供源代码实现和可视化展示,帮助读者深入理解各种排序算法的工作原理。 1. 冒泡排序(Bubble Sort) 冒泡排序是最基础的排序算法之一,通过重复遍历待排序序列,比较相邻...
本文将深入探讨三种常见的排序算法——插入排序、希尔排序和快速排序,并介绍如何在MATLAB环境下进行仿真及统计它们的运算量。MATLAB是一种强大的数值计算和可视化工具,适合用于算法的开发和性能评估。 首先,我们...
这些Flash演示对于初学者来说尤其有价值,因为它们以动态、可视化的方式展示了排序算法的工作原理,有助于理解和记忆。通过观看这些演示,你可以深入理解每种算法的时间复杂度、空间复杂度以及适用场景,从而在实际...
本资源"总结了各种排序算法,并用C++代码实现,并有演示",提供了丰富的学习材料,包括不同类型的排序算法以及它们的C++实现,还有可能的可视化演示,帮助理解每种算法的工作原理。 首先,让我们逐一了解常见的排序...