Shellsort is a simple extension of insertion sort that gains speed by allowing exchanges of array entries that are far apart, to produce partially sorted arrays that can be efficiently sorted, eventually by insertion sort.
The idea is to rearrange the array to give it the property that taking every hth entry (starting anywhere) yields a sorted subsequence. Such an array is said to be h-sorted. Put another way, an h-sorted array is h independent sorted subsequences, interleaved together. By h-sorting for some large values of h, we can move items in the array long distances and thus make it easier to h-sort for smaller values of h. Using such a procedure for any sequence of values of h that ends in 1 will produce a sorted array: that is shellsort. Another alternative is to store an increment sequence in an array.
One way to implement shellsort would be, for each h, to use insertion sort independently on each of the h sub sequences. Because the subsequences are independent, we can use an even simpler approach: when h-sorting the array, we insert each item among the previous items in its h-subsequence by exchanging it with those that have larger keys (moving them each one position to the right in the subsequence). We accomplish this task by using the insertion-sort code, but modified to decrement by h instead of 1 when moving through the array. This observation reduces the shellsort implementation to an insertion-sort-like pass through the array for each increment.
Shellsort gains efficiency by making a tradeoff between size and partial order in the subsequences. At the beginning, the subsequences are short; later in the sort, the subsequences are partially sorted. In both cases, insertion sort is the method of choice. The extent to which the subsequences are partially sorted is a variable factor that depends strongly on the increment sequence. Understanding shellsort’s performance is a challenge. Indeed, it is the only sorting method we consider whose performance on randomly ordered arrays has not been precisely characterized.
public class Shell { // sort the array a[] in ascending order using Shellsort public static void sort(Comparable[] a) { int N = a.length; // 3x+1 increment sequence: 1, 4, 13, 40, 121, 364, 1093, ... int h = 1; while (h < N/3) h = 3*h + 1; while (h >= 1) { // h-sort the array for (int i = h; i < N; i++) { for (int j = i; j >= h && less(a[j], a[j-h]); j -= h) { exch(a, j, j-h); } } assert isHsorted(a, h); h /= 3; } assert isSorted(a); } /*********************************************************************** * Helper sorting functions ***********************************************************************/ // is v < w ? private static boolean less(Comparable v, Comparable w) { return (v.compareTo(w) < 0); } // exchange a[i] and a[j] private static void exch(Object[] a, int i, int j) { Object swap = a[i]; a[i] = a[j]; a[j] = swap; } /*********************************************************************** * Check if array is sorted - useful for debugging ***********************************************************************/ private static boolean isSorted(Comparable[] a) { for (int i = 1; i < a.length; i++) if (less(a[i], a[i-1])) return false; return true; } // is the array h-sorted? private static boolean isHsorted(Comparable[] a, int h) { for (int i = h; i < a.length; i++) if (less(a[i], a[i-h])) return false; return true; } // print array to standard output private static void show(Comparable[] a) { for (int i = 0; i < a.length; i++) { System.out.println(a[i]); } } }
相关推荐
通过以上内容可以看出,《C++数据结构与算法(第4版)》这本书旨在全面介绍数据结构的基本概念、常用的数据结构类型、典型排序和查找算法,以及算法设计与分析的方法和技术。这些知识点对于学习计算机科学和编程语言...
### 数据结构排序算法详解 #### 冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复进行的,直到没有...
数据结构课程排序算法中的经典shell排序
通过这些实现,用户可以深入理解各种算法的原理和应用场景,同时也可以作为学习和实践数据结构与算法的参考。 项目的主要特性和功能 1. 排序算法 冒泡排序(Bubble Sort) 选择排序(Selection Sort) 插入...
数据结构中的排序算法是计算机科学中的重要概念,用于组织和管理数据,提高数据访问和处理的效率。在C++编程中,实现各种排序算法能够帮助理解它们的工作原理,并且可以对比不同算法在不同情况下的性能。以下是几种...
### 数据结构-排序算法的实现知识点详解 #### 实验背景及目标 本次实验的主要目的是让学生深入理解并掌握几种常见的排序算法及其应用场景。通过动手实践,不仅能够加深对各种排序算法工作原理的理解,还能够培养...
根据给定的信息,本文将详细解释每种提及的数据结构与算法知识点,并且提供相关的C#实现示例。这些算法包括冒泡排序、选择排序、插入排序、...希望这些内容能帮助您更好地理解这些数据结构与算法的基础概念和应用场景。
在计算机科学中,数据结构和算法是至关重要的基础,它们直接影响到程序的效率和性能。本资源"数据结构排序查找常用算法实现.zip"提供了一系列常用排序和查找算法的实现,帮助开发者深入理解并掌握这些核心概念。以下...
数据结构算法实现(严蔚敏版配套实现程序) 1.1 数组和字符串 2 1.1.1 一维数组的倒置 2 范例1-1 一维数组的倒置 2 ∷相关函数:fun函数 1.1.2 一维数组应用 3 范例1-2 一维数组应用 3 1.1.3 一维数组的高级应用 5 ...
数据结构课程设计五——排序算法综合分析 该资源是一个数据结构课程设计的...该资源提供了一个完整的排序算法课程设计,涵盖了多种排序算法的实现和分析,为学习数据结构和算法的学生提供了一个非常有价值的参考资源。
数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和组织数据,以便进行各种操作。排序算法则是数据结构中的重要部分...通过实践和比较,可以更好地理解数据结构和算法的效率,从而在实际编程中做出更优选择。
"05 ShellSort"这个压缩包可能包含严蔚敏教授关于Shell排序的具体实现代码,通过学习和实践这部分内容,我们可以加深对数据结构和排序算法的理解,提升编程能力,为后续的算法学习和开发工作打下坚实基础。
严蔚敏教授和吴伟民教授的《数据结构》教材是一本经典之作,它详细介绍了各种数据结构及其算法。排序是数据结构中的基础操作,广泛应用于各种计算问题,如数据库管理、数据分析、计算机图形学等领域。 以下是压缩包...
在IT领域,排序算法是计算机科学中的核心概念,它涉及到数据结构、算法分析以及效率优化等多个方面。排序算法主要用于将一组无序的数据按照特定的顺序排列。这些算法在数据库管理、数据分析、图形处理等众多应用中都...
这些算法是数据结构的基础内容,在面试或实际编程工作中常常被用到。 ### 一、插入排序(Insertion Sort) #### 算法描述: 插入排序的基本思想是通过构建有序序列,对于未排序的数据,在已排序序列中从后向前扫描...
本教程涵盖了Java数据结构与算法的基础知识,通过一系列视频课程和代码示例,旨在帮助学习者掌握数据结构的基本概念和算法设计的基本技巧。无论是初学者还是有一定基础的学习者,都可以从中获得实用的知识和技能,为...
∷相关函数:ShellSort函数 1.5.7 冒泡排序 243 范例1-83 冒泡排序 243 ∷相关函数:bubble_sort函数 1.5.8 一趟快速排序 246 范例1-84 一趟快速排序 246 ∷相关函数:QSort函数 1.5.9 一趟快速排序的改进算法 248 ...
本教程旨在帮助准备软考初级和中级考试的考生全面理解数据结构与算法的基础知识。 #### 二、数据结构基础知识 **1. 线性表(Linear List)** 线性表是最基本的数据结构之一,包括顺序表和链表两种实现方式。 - *...