`

希尔排序(改进型的直接插入排序)

阅读更多

算法思想:

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
该方法实质上是一种分组插入方法。


Shell排序的时间性能优于直接插入排序
  希尔排序的时间性能优于直接插入排序的原因:
  ①当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。
  ②当n值较小时,n和n2的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度0(n2)差别不大。
  ③在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。
  因此,希尔排序在效率上较直接插人排序有较大的改进。





public class shellsort {

public static void shellInsert(int[] a, int dk) {
int i, j, temp;
for (i = dk; i < a.length; i++) {
if (a[i] < a[i - dk]) {//要不要无所谓,只是能少一些判断,效率高点
temp = a[i];
for (j = i; j >= dk && temp < a[j - dk]; j = j - dk) {
a[j] = a[j- dk];
}
a[j] = temp;
print.p("执行一次");
}
}

}
public static void main(String args[]) {

int a[] = { 48,37,64,96,75,12,26,48,54,3 };
int h=a.length;

//按照如下规律来排序
while (h > 1) {
h=h/2;
shellInsert(a, h);
print.p(a);
}
}

}


执行结果


执行一次
执行一次
执行一次
执行一次
执行一次
12 26 48 54 3 48 37 64 96 75
执行一次
执行一次
执行一次
3 26 12 48 37 54 48 64 96 75
执行一次
执行一次
执行一次
执行一次
3 12 26 37 48 48 54 64 75 96
分享到:
评论

相关推荐

    基数排序、堆排序、希尔排序、直接插入排序

    这里我们将深入探讨四种常见的排序算法:基数排序、堆排序、希尔排序和直接插入排序。 首先,基数排序是一种非比较型整数排序算法,它的基本思想是将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序...

    C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序

    - 希尔排序是插入排序的改进版,通过设置间隔序列来减少元素的比较次数,使元素能够更快地达到基本有序状态。 - 在C#中,希尔排序通常使用增量序列进行多次插入排序,随着增量逐渐减小,直到为1,完成排序。 了解...

    数据结构——希尔排序

    总的来说,希尔排序是一种改进的插入排序,通过增量策略优化了插入排序在处理大规模数据时的效率,适用于需要快速排序但又无法使用更高级排序算法的情况。在实际编程中,希尔排序常常作为其他复杂排序算法的备选方案...

    插入和希尔排序及测试用例

    2. 对每个子序列{a[i+ti], a[i+2*ti]……}进行直接插入排序。 3. 重复第二步,直到增量减小到1。 4. 当增量为1时,整个序列作为一个表来处理,表长度即为整个序列的长度。 希尔排序的时间复杂度很难精确计算,因为...

    插入类排序希尔排序

    希尔排序(Shell Sort)是一种插入类排序算法,它改进了原始的插入排序,通过将待排序的元素分组,使得相同组内的元素进行插入排序,然后逐渐减小组的间隔,使得元素逐步接近最终的有序状态。这种方法可以减少元素移动...

    希尔排序.zip

    如果增量序列选择得当,希尔排序的平均时间复杂度可以达到O(nlogn),最坏情况下为O(n^2),但比直接插入排序的O(n^2)在实际应用中要快得多。 希尔排序的优点在于其高效的性能,尤其是在处理大型数据集时,能够显著...

    排序总结(选择、插入、冒泡、希尔、快速、箱子、基数、归并、堆)

    希尔排序是基于插入排序的以下两点性质而提出改进方法: 1. 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率; 2. 但若初始序列随机排列,则其效率为平方级。 希尔排序的代码实现如下:...

    源程序给出了插入排序、选择排序、希尔排序、堆排序、冒泡、双向冒泡、快速排序、归并排序、递归的归并排序、基数排序等多种排序算法,其中有17处需要填空。

    3. **希尔排序**(Shell Sort):它是插入排序的一种优化版本,通过将待排序的元素按照一定的间隔分组,对每组进行插入排序,然后逐渐减小间隔,直到间隔为1。希尔排序的时间复杂度取决于所选的间隔序列,通常介于O...

    算法-数据结构之希尔排序(谢尔排序).rar

    希尔排序,又称谢尔排序,是插入排序的一种更高效的改进版本。由Donald Shell于1959年提出,它的基本思想是将待排序的元素按照一定的增量分组,对每组进行直接插入排序,随着增量逐渐减少,每组包含的关键词越来越多...

    C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等

    它通过比较相距一定间隔的元素来进行排序,间隔逐渐缩小,最终达到直接插入排序的条件。希尔排序的时间复杂度介于O(n^2)和O(nlogn)之间,具体取决于间隔序列的选择。 5. **快速排序**(Quick Sort): 快速排序是...

    js代码-希尔排序(简单插入排序改进版,优先比较距离较远的元素)

    希尔排序的核心思想是将待排序的数组元素按某个增量分组,然后对每组进行直接插入排序。随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 希尔排序的时间复杂度...

    内部排序算法分析

    - **希尔排序**:改进的插入排序,通过增量序列对数据进行预排序,再进行直接插入排序,提高了效率。 - **堆排序**:通过构建堆结构,利用堆的性质进行排序,具有稳定的O(n log n)时间复杂度。 3. **C语言实现**...

    java类实现数组的冒泡选择插入希尔等五种排序扫描.pdf

    它通过将待排序的元素按照一定的增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。希尔排序的时间复杂度在最坏的情况下...

    C++实现多种排序

    希尔排序通过将原来要排序的记录序列分割成若干子序列分别进行直接插入排序,使得整个序列成为基本有序,从而减少最终排序的工作量。 ### 归并排序 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用...

    排序算法集锦

    插入排序算法包括直接插入排序、折半插入排序和希尔排序。直接插入排序的步骤是将无序序列中的数据逐个插入到已经排好序的序列中,通过这种方式,一个无序序列被转换成有序序列。折半插入排序是对直接插入排序的一种...

    基于JavaScript实现的希尔排序算法分析

    希尔排序算法是一种基于插入排序改进的算法,由Donald Shell于1959年提出。其基本思想是在进行直接插入排序的基础上,通过引入间隔的概念来减少元素移动的次数,从而提高效率。在直接插入排序中,每个元素需要与它...

    计算机软件及应用数据结构排序中国石油大学华东PPT课件.pptx

    希尔排序的时间复杂度通常低于直接插入排序和折半插入排序,但具体效率取决于增量序列的选择。 总的来说,理解各种排序算法的特性和适用场景对于优化数据处理效率至关重要。在实际应用中,根据数据规模、稳定性需求...

    10种排序法 冒泡、选择、插入、希尔、

    它通过将待排序的元素按某个增量分组,对每组进行直接插入排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。希尔排序的时间复杂度在最坏情况下为O(nlogn),但...

    c++内部排序算法比较

    本文将深入探讨七种常见的内部排序算法:直接插入排序、折半插入排序、冒泡排序、简单选择排序、希尔排序、快速排序以及堆排序。通过对这些算法的比较次数和移动次数的分析,我们可以更好地理解它们的效率和适用场景...

Global site tag (gtag.js) - Google Analytics