希尔排序是在插入排序的基础上对插入排序进行了优化。我们知道插入排序的过程是将后面的要排序的数字依次和待排序前面的数字进行比较,然后判断大小,最后在进行交换。
这就存在一个很大的问题,就是如果最小的数字在最右边的话,按照我们排序的要求(顺序排列)这个最小的数字要依次和前面的n-1个数字进行比较,然后复制交换,所以插入排序的最大的缺点就是复制的次数过多。
实际上我们可以在直接进行插入排序之前对数据进行“处理”,所谓的“处理”就是让数据变得有序一些,不那么随机化,希尔排序也就做了这样一件事情,使用了一个“增量”,用这个“增量”来对待排序的数组进行分组(比如对10个数据进行排序,按照增量为4来分,就可以分别对下标为(0,4,8)(1,5,9)的两组数据进行小规模的排序)在这个小的规模的数组中采用直接插入排序的方法将小的数组排好序,然后将增量减小,再重复进行,最后当增量减小到1的时候就进行最后的一次排序,和我们以前的插入排序是一样的方法,只不过这次插入排序是在经过我们前面处理之后才进行的,进过前面的处理,数据基本上已经达到了有序了,所以在最后一次进行插入排序的时候复制量就减小了很多,大大的提高了效率,时间效率虽然不及快排,但是比直接插入排序还是快了很多。
代码:
package 希尔排序; /** * 希尔排序 * * @author TMs * */ public class ShellSort { public static int count = 0; public static void main(String[] args) { int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 }; print(data); shellSort(data); print(data); } public static void shellSort(int[] data) { // 计算出最大的h值 int h = 1; while (h <= data.length / 3) { h = h * 3 + 1; } while (h > 0) { for (int i = h; i < data.length; i += h) { if (data[i] < data[i - h]) { int tmp = data[i]; int j = i - h; while (j >= 0 && data[j] > tmp) { data[j + h] = data[j]; j -= h; } data[j + h] = tmp; print(data); } } // 计算出下一个h值 h = (h - 1) / 3; } } public static void print(int[] data) { for (int i = 0; i < data.length; i++) { System.out.print(data[i] + "\t"); } System.out.println(); } }
打印输出结果:
5 3 6 2 1 9 4 8 7 1 3 6 2 5 9 4 8 7 1 2 3 6 5 9 4 8 7 1 2 3 5 6 9 4 8 7 1 2 3 4 5 6 9 8 7 1 2 3 4 5 6 8 9 7 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9
相关推荐
希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的元素按照一定的间隔分组,对每组进行插入排序,然后逐渐减小间隔,直到间隔为1,此时整个序列视为...
希尔排序:分别使用Java和Python实现希尔排序算法 希尔排序:分别使用Java和Python实现希尔排序算法 希尔排序:分别使用Java和Python实现希尔排序算法 希尔排序:分别使用Java和Python实现希尔排序算法 希尔排序:...
希尔排序(Shell Sort)是一种基于插入排序的快速排序方法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一定的间隔进行分组,然后对每组...对于学习和理解排序算法,希尔排序是不可或缺的一部分。
2. 冒泡排序:是最简单的排序算法之一,通过不断交换相邻位置的元素来逐渐达到排序的目的。每一轮遍历都能确保最大(或最小)的元素被放置到正确的位置,重复这个过程直到整个数组排序完成。 3. 选择排序:每次从未...
希尔排序(Shell Sort)是一种基于插入排序的快速排序方法,由Donald Shell于1959年提出。它的基本思想是将待排序的元素按照...在C语言中,希尔排序通常作为一个基础的排序算法实现,用于教学和理解排序算法的原理。
本话题主要探讨六种内部排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序以及堆排序。这六种排序算法各有优劣,适用于不同的场景,接下来我们将逐一进行详细阐述。 1. **直接插入排序**: 直接...
在众多排序算法中,希尔排序、冒泡排序、插入排序和选择排序因其简洁性和易于理解性,成为了经典的入门级算法。本文将对这些算法进行详细的探讨,旨在分析它们的原理、特点及适用场景。 首先,让我们来看看希尔排序...
1、实现KMP模式匹配算法、哈夫曼编码算法、由遍历序列恢复二叉树、Prim算法、Kruskal算法、Floyd算法、Dijkstra算法、拓扑排序、关键路径算法、二叉排序树生成算法(含平衡化)、哈希表生成及哈希查找算法、希尔排序...
Hoare发明,是目前最常用的排序算法之一。它采用分治策略,选取一个“基准”元素,将数组分为两部分:一部分的所有元素都小于基准,另一部分的所有元素都大于基准。然后对这两部分递归地进行快速排序。平均情况下,...
python python_十大排序算法之希尔排序
排序算法汇总(选择排序、直接插入排序、冒泡排序、希尔排序、快速排序、堆排序) 本资源介绍了六种常用的排序算法:选择排序、直接插入排序、冒泡排序、希尔排序、快速排序和堆排序。下面对每种算法进行详细介绍:...
希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一个增量序列分成若干个子序列,然后分别对子序列进行插入排序,最后再进行一次全局的插入...
希尔排序是一种比较实用的排序算法,虽然它不是稳定的排序算法(即相等的元素可能会改变原有的相对顺序),但其效率在许多情况下优于其他简单的排序算法,特别是在处理大规模数据时。在编程实践中,理解并掌握希尔...
【基础算法】-python希尔排序# python实现希尔排序(插入排序的一种)# 先宏观进行调整,在进行微观调整 def shellSort(lst, k, reverse=False): length = len(lst) dk = k # 设置一个增量dk while dk > 0: for i in ...
尽管希尔排序不是稳定的排序算法(即相等的元素可能会改变原有的相对顺序),但其高效性和灵活性使其在实际应用中仍有一定价值。 在C#中实现希尔排序,首先需要理解C#的基本语法和数据结构。C#是一种面向对象的编程...
本文将详细讲解六种经典的排序算法——合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合提供的文件名(sort.c、set.c、main.c、set.h、sort.h)推测出每个文件可能包含的代码实现。 1. **合并...
希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的元素按照一定的间隔分组,对每组进行插入排序,然后逐渐减小间隔,直至间隔为1,完成整个序列的...
希尔排序是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的数组元素按照一定的间隔分组,然后对每组进行插入排序,随着间隔逐渐减小,直到间隔为1时,整个数组成为一个组,...
Hoare在1960年提出,是目前应用最广泛的排序算法之一。它采用分治策略,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行...
希尔排序算法详解 希尔排序(Shell Sort)是一种改进的插入排序算法,它的基本思想是将待排序的数组按照一定的间隔进行分组,对每组使用插入排序算法进行排序,然后缩小间隔,再对分组进行排序,直到间隔为1 为止。...