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;
}
输出:

希尔排序的复杂度分析、优缺点、以及应用:
希尔排序的复杂度分析:
时间复杂度:
- 最佳情况: 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) 算法(如归并排序)来说,这种算法过于耗费资源。
- 适用于内存有限的嵌入式系统(由于原地排序)。
- 有时用作混合算法中的子程序。

浙公网安备 33010602011771号