希尔排序(Shell Sort)又称为“缩小增量排序”。是1959年由D.L.Shell提出来的。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
具体做法:首先确定一组增量d0,d1,d2,d3,...,dt-1()其中n>d0>d1>...>dt-1=1),对于i=0,1,2,...,t-1,依次进行下面的各趟处理:根据当前增量di将n个元素分成di个组,每组中元素的下标相隔为di;再对各组中元素进行直接插入排序.
给定实例的shell排序的排序过程
假设待排序文件有10个记录,其关键字分别是:
49,38,65,97,76,13,27,49,55,04。
增量序列的取值依次为:
5,3,1
排序过程如【动画模拟演示】。
希尔排序的JAVA实现
public class Test {
public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 };
public static void main(String args[]) {
int i; // 循环计数变量
int Index = a.length;// 数据索引变量
System.out.print("排序前: ");
for (i = 0; i < Index - 1; i++)
System.out.printf("%3s ", a[i]);
System.out.println("");
ShellSort(Index - 1); // 选择排序
// 排序后结果
System.out.print("排序后: ");
for (i = 0; i < Index - 1; i++)
System.out.printf("%3s ", a[i]);
System.out.println("");
}
public static void ShellSort(int Index) {
int i, j, k; // 循环计数变量
int Temp; // 暂存变量
boolean Change; // 数据是否改变
int DataLength; // 分割集合的间隔长度
int Pointer; // 进行处理的位置
DataLength = (int) Index / 2; // 初始集合间隔长度
while (DataLength != 0) // 数列仍可进行分割
{
// 对各个集合进行处理
for (j = DataLength; j < Index; j++) {
Change = false;
Temp = a[j]; // 暂存Data[j]的值,待交换值时用
Pointer = j - DataLength; // 计算进行处理的位置
// 进行集合内数值的比较与交换值
while (Temp < a[Pointer] && Pointer >= 0 && Pointer <= Index) {
a[Pointer + DataLength] = a[Pointer];
// 计算下一个欲进行处理的位置
Pointer = Pointer - DataLength;
Change = true;
if (Pointer < 0 || Pointer > Index)
break;
}
// 与最后的数值交换
a[Pointer + DataLength] = Temp;
if (Change) {
// 打印目前排序结果
System.out.print("排序中: ");
for (k = 0; k < Index; k++)
System.out.printf("%3s ", a[k]);
System.out.println("");
}
}
DataLength = DataLength / 2; // 计算下次分割的间隔长度
}
}
}
算法分析
1.增量序列的选择
Shell排序的执行时间依赖于增量序列。
好的增量序列的共同特征:
① 最后一个增量必须为1;
② 应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况。
有人通过大量的实验,给出了目前较好的结果:当n较大时,比较和移动的次数约在nl.25到1.6n1.25之间。
2.Shell排序的时间性能优于直接插入排序
希尔排序的时间性能优于直接插入排序的原因:
①当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。
②当n值较小时,n和n2的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度0(n2)差别不大。
③在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。
因此,希尔排序在效率上较直接插人排序有较大的改进。
3.稳定性
希尔排序是不稳定的。参见上述实例,该例中两个相同关键字49在排序前后的相对次序发生了变化
分享到:
相关推荐
希尔排序的核心思想是“增量序列”(或称为“间隔序列”),它决定了元素如何被分组。经典的增量序列是序列的一半,即每次将间隔减半,但这不是唯一的选择。希尔排序的性能与选择的增量序列有很大关系,最优的增量...
希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的元素按照一定的间隔分组,对每组进行插入排序,然后逐渐减小间隔,直到间隔为1,此时整个序列视为...
希尔排序(Shell Sort)是由Donald Shell在1959年提出的一种基于插入排序的改进算法。它的主要思想是通过设置一系列的增量序列,逐步减少这些增量,将待排序的元素进行分组,然后在每个小组内进行直接插入排序。这个...
希尔排序的核心思想是引入一个增量序列,将原始数组分割成多个子序列,并对这些子序列分别进行插入排序或交换排序。随着增量逐渐减小,最终当增量为1时,算法退化为简单的插入排序,此时整个数组已经基本有序,从而...
希尔排序(Shell Sort)是一种基于插入排序的快速排序方法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一定的间隔进行分组,然后对每组进行插入排序,随着间隔逐渐缩小,最后进行一次全排列,...
希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一定的增量分组,对每组使用直接插入排序,然后逐渐减小增量,继续进行分组排序,直到增量...
希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一个增量序列分成若干个子序列,然后对每个子序列进行插入排序,最后再进行一次全局的插入...
希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一个增量序列分成若干个子序列,然后对每个子序列进行插入排序,最后减小增量,重复这个...
希尔排序的核心思想是打破原始数组的顺序,通过增量间隔将数组分为多个子序列,然后对每个子序列进行插入排序。插入排序在处理小规模有序数据时效率较高,希尔排序正是利用了这一点,先处理较大的间隔,使得元素尽...
希尔排序的核心思想是通过将相隔某个增量(gap)的元素组成一个子序列进行插入排序,随着排序过程的推进,逐步减小增量值,最终当增量为1时,算法退化为普通的插入排序。 #### 二、希尔排序的增量序列选择 在希尔...
希尔排序的基本思想是:将待排序列分割成若干子序列分别进行插入排序,具体分割的方式是由一个增量序列决定的,而这个增量序列是递减的,当增量为1时,整个序列作为一个整体被处理,此时就变成了普通的插入排序。...
希尔排序首先选择一个较大的增量,对数组进行插入排序,然后逐渐减小增量,再次对数组进行插入排序,直到增量为1,这时数组的每个元素间隔为1,相当于进行了一次插入排序,整个数组已经基本有序。在给出的`...
这里我们将深入探讨四种常见的排序算法:基数排序、堆排序、希尔排序和直接插入排序。 首先,基数排序是一种非比较型整数排序算法,它的基本思想是将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序...
【希尔排序】希尔排序是一种基于插入排序的快速排序算法,由希尔(Hoare)提出。它的主要思想是将待排序的元素按照一定的间隔分组,然后对每组进行插入排序,随着间隔逐渐减小,最后当间隔为1时,整个序列就是一个有序...
希尔排序的核心思想是“缩小增量排序”,它首先将数组按照一定的间隔分成多个子序列,然后对每个子序列进行插入排序。间隔通常选择为数组长度的一半,之后每次将间隔减半,直到间隔为1,此时数组变为一个子序列,...
希尔排序的基本思想是将待排序的记录按照一定的增量分组,对每组使用直接插入排序算法排序;随着增量序列逐步缩小,每组包含的记录越来越多,当增量减小到1时,整个序列作为一个整体进行排序。 **具体步骤如下:** ...
希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一个增量序列分成若干个子序列,然后对每个子序列进行插入排序,最后再进行一次全局的插入...
希尔排序的核心思想在于分组插入排序,具体步骤如下: 1. **选择间隔**:首先选择一个初始间隔值,通常是数组长度的一半。 2. **分组**:将所有相隔该间隔的元素划分为一组,对每组执行插入排序。 3. **调整间隔**...
希尔排序是一种基于插入排序的快速改进算法,由美国计算机科学家Donald Shell在1959年提出。它通过将数组中的元素按照一定的间隔分组,然后对每个组进行插入排序,逐渐缩小间隔,最终使得整个数组变得有序。这种方法...
本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...