C++ 语言 实现希尔排序算法

C++阿木 发布于 2025-06-14 9 次阅读


希尔排序算法的C++实现与优化

希尔排序(Shell Sort)是一种基于插入排序的算法,它通过比较相隔一定距离的元素来工作,这个距离随着算法的进行而逐渐减小。希尔排序是插入排序的一种改进版本,它通过比较较远距离的元素来减少数据移动的次数,从而提高排序效率。本文将围绕C++语言实现希尔排序算法,并对其性能进行优化。

希尔排序算法原理

希尔排序的基本思想是:将整个待排序的序列分割成若干子序列分别进行插入排序,随着排序过程的进行,逐渐减少每个子序列的长度,直到整个序列被排序。

步骤分析

1. 选择间隔序列:选择一个间隔序列t1, t2, ..., tk,其中ti > tj,且tk = 1。
2. 分组排序:将序列分成tk个子序列,每个子序列的元素间隔为ti,对每个子序列进行插入排序。
3. 减小间隔:将间隔序列tk减小到tk-1,重复步骤2,直到间隔为1。
4. 最终排序:当间隔为1时,对整个序列进行一次插入排序。

C++实现

以下是一个简单的希尔排序算法的C++实现:

cpp
include
using namespace std;

void shellSort(int arr[], int n) {
for (int gap = n / 2; gap > 0; gap /= 2) {
for (int i = gap; i = gap && arr[j - gap] > temp; j -= gap) {
arr[j] = arr[j - gap];
}
arr[j] = temp;
}
}
}

void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
}

int main() {
int arr[] = {12, 34, 54, 2, 3};
int n = sizeof(arr) / sizeof(arr[0]);
shellSort(arr, n);
cout << "Sorted array: ";
printArray(arr, n);
return 0;
}

性能优化

间隔序列的选择

间隔序列的选择对希尔排序的性能有很大影响。以下是一些常用的间隔序列:

- Hibbard序列:1, 2, 4, 8, ..., 2^k
- Knuth序列:1, 4, 13, 40, 121, 364, ...
- Sedgewick序列:1, 5, 19, 41, 109, 285, ...

在实际应用中,可以根据具体情况选择合适的间隔序列。

优化代码

以下是一个使用Sedgewick序列的希尔排序算法的C++实现:

cpp
include
include
using namespace std;

void shellSort(int arr[], int n) {
vector gaps = {701, 301, 132, 57, 23, 10, 4, 1};
for (int gap : gaps) {
for (int i = gap; i = gap && arr[j - gap] > temp; j -= gap) {
arr[j] = arr[j - gap];
}
arr[j] = temp;
}
}
}

void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
}

int main() {
int arr[] = {12, 34, 54, 2, 3};
int n = sizeof(arr) / sizeof(arr[0]);
shellSort(arr, n);
cout << "Sorted array: ";
printArray(arr, n);
return 0;
}

总结

希尔排序是一种高效的排序算法,通过选择合适的间隔序列和优化代码,可以进一步提高其性能。本文介绍了希尔排序算法的原理、C++实现以及性能优化方法,希望对读者有所帮助。