C++ Shell 排序

2024 年 8 月 28 日 | 3 分钟阅读

在计算机科学中,排序算法经常用于以特定顺序排列数据。有许多种排序算法,每种算法都有其优点和缺点。希尔排序是最广泛使用的排序算法之一,有时也被称为递减增量排序。在这篇博文中,我们将讨论希尔排序算法以及如何使用 C++ 构建它。

希尔排序方法用于对数组进行排序,它比较相距较远的元素而不是相邻的元素。该过程首先使用一个增量序列将数组分成较小的子数组,也称为 h-排序数组。增量序列是一组数字,表示将要比较的元素之间的间距。Knuth 序列通常用于计算增量序列,其公式为 3k - 1,其中 k 是一个整数

之后,算法在构建子数组后,对每个子数组执行插入排序。每个插入排序都是一个简单的排序算法,它检查每个元素与其邻居的位置关系,并在必要时进行交换。每个子数组都执行插入排序,从最大增量开始,并逐渐缩小增量,直到它等于1。算法现在对整个数组执行最终的插入排序,以确保所有元素都按正确顺序排列。

该算法以 Donald Shell 的名字命名,他于 1959 年开发并最初提出了该算法。既然我们熟悉了 希尔排序 的基础知识,那么让我们看看如何使用 C++ 实现它。实现分为三个基本步骤

  1. 以增量序列为指导,将数组分成子数组。
  2. 对每个子数组执行插入排序。
  3. 减小增量直到它等于 1,然后对整个数组执行最终的插入排序。

示例

让我们检查希尔排序算法的 C++ 源代码。

输出

上述代码的输出是

Sorted array: 1 2 3 4 5 6 7 8 9

说明

在上述代码中,我们首先使用数组的大小确定增量序列。从 n/2 的增量序列开始,我们将增量减半,直到它只剩下 1。之后,从增量开始,一直到数组的末尾,我们对每个子数组执行插入排序。插入排序比较的是相距较远的元素,而不是相邻的元素。

结论

在这篇博文中,我们讨论了希尔排序算法及其 C++ 实现。希尔排序方法是一种快速有效的数组排序方法,它比较相距较远的元素而不是附近的元素。该过程首先使用增量序列将数组分成较小的子数组,然后对每个子数组进行插入排序。Knuth 序列用于计算增量序列,其表示为 3k - 1。在将增量减小到1之后,算法对整个数组执行最终的插入排序。

这篇博文的代码示例可以很容易地修改,以对不同数据类型或不同顺序(例如,降序)的数组进行排序。PrattTokuda 序列用于创建增量序列,这是希尔排序方法可以探索的另外两种变体。希尔排序是一种广受欢迎的排序算法,因为它简单有效,并且在实践中是排序中小型数组的流行选择。