4-4 比较排序:Shell排序

希尔排序

希尔排序,也称为希尔方法,是一种原地比较排序算法,也是插入排序的优化版本。它通过允许元素在初始阶段移动更大的距离来提高插入排序的效率,从而显著减少所需的交换次数,尤其适用于大型数据集。

  • 它被认为是第一个突破排序算法O(n²)时间复杂度障碍的算法。
  • 它的工作原理是先比较相距较远的元素,然后逐渐缩小间距。这样可以加快元素在数组中的移动速度。

该算法的步骤如下:

  • 选择一个空位序列(通常n/2, n/4, ... , 1)。
  • 使用插入排序法对每个间隙处的元素进行排序。
  • 减小间隙并重复此操作,直到间隙变为 1。

代码实现

#include <iostream>
#include <vector>

void shellSort(std::vector<int>& arr)
{
    int n = arr.size();

    // Start with a large gap, then reduce it step by step
    for (int gap = n / 2; gap > 0; gap /= 2)
    {
        // Perform a "gapped" insertion sort for this gap size
        for (int i = gap; i < n; i++)
        {
            // Current element to be placed correctly
            int temp = arr[i];
            int j = i;

            // Shift elements that are greater than temp to make space
            while (j >= gap && arr[j - gap] > temp)
            {
                arr[j] = arr[j - gap];
                j -= gap;
            }

            // Place temp in its correct location
            arr[j] = temp;
        }
    }
}

// Utility function to print the vector
void printArray(const std::vector<int>& arr)
{
    for (int num : arr)
    {
        std::cout << num << " ";
    }
    std::cout << std::endl;
}

int main()
{
    std::vector<int> arr = {12, 34, 54, 2, 3};

    shellSort(arr);
    printArray(arr);

    return 0;
}

输出:
image


希尔排序的复杂度分析、优缺点、以及应用:

希尔排序的复杂度分析:
时间复杂度:

  • 最佳情况: O(n log n),此时数组已基本排序(取决于间隙序列)。
  • 平均情况:介于 O(n^1.25) 和 O(n^1.5) 之间,具体取决于所选的空位序列。
  • 最坏情况: O(n²),对于简单的间隔序列,如 n/2、n/4、…、1。

辅助空间: O(1),因为它进行原地排序。

  • 稳定性:不稳定(相等的元素可能不会保持其原始相对顺序)。

希尔排序的优势

  • 原地排序:仅需 O(1) 额外空间。
  • 比插入排序更快:尤其适用于大型数组。
  • 易于实现:对插入排序的直接改进。

希尔排序的缺点

  • 不稳定:不能保持相等元素的顺序。
  • 性能取决于间隙序列:错误的选择会导致 O(n²)。
  • 速度比高级算法慢:归并排序、快速排序和 Tim 排序在大数据集上通常比它快。

希尔排序的应用:

  • 适用于中等规模的数组,对于 O(n log n) 算法(如归并排序)来说,这种算法过于耗费资源。
  • 适用于内存有限的嵌入式系统(由于原地排序)。
  • 有时用作混合算法中的子程序。
posted @ 2026-03-30 17:27  游翔  阅读(5)  评论(0)    收藏  举报