希尔排序算法是插入排序算法的一种改进版本。它可以减少插入排序算法中数据移动的次数,加快排序速度,因此有被称为缩小增量排序法。
希尔排序算法的基本思想是:将原始数据分成特定间隔的几组数据,然后使用插入排序算法对每组数据进行排序,排序后再减少间隔距离,重复上面的步骤,直到排序完成为止。
代码如下。
#includeusing namespace std; int *create_rand_arr() { int length = 10; // 定义长度为10 srand(time(0)); // 设置时间种子 int *rand_arr = new int [length]; for (int i = 0; i < length; i++) { rand_arr[i] = rand() % (100 - -100 + 1) + -100; // 将随机数填充进数组指针中 } return rand_arr; } int get_length(int *arr) { return _msize(arr) / sizeof(*arr); } void hill_sort(int *arr) { int length = get_length(arr), step = length / 2, t1, t2, t3, i = 1; // 获取长度和偏移值 while (step >= 1) { // 只要在合理范围内,就可以一直遍历下去 for (int j = step; j < length; j++) { t1 = j; // 临时存储j的值 while (t1 - step >= 0) { if (arr[t1] > arr[t1 - step]) { // 交换位置 t2 = arr[t1]; t3 = arr[t1 - step]; arr[t1] = t3; arr[t1 - step] = t2; t1 -= step; // 更新下标值 } else { break; } } } step /= 2; // 继续细分 i++; // 计数 } } int main() { int *arr = create_rand_arr(); // 制作随机整数数组 int length = get_length(arr); // 获取长度 // 输出原数组 cout << "原数组: "; for (int i = 0; i < 10; i++) { cout << arr[i] << " "; } cout << endl; // 使用希尔排序函数进行排序 hill_sort(arr); // 输出新数组 cout << "新数组: "; for (int i = 0; i < 10; i++) { cout << arr[i] << " "; } return 0; }
运行结果如下。
希尔排序算法的平均时间复杂度为
O
(
l
o
g
n
)
O(log n)
O(logn),最坏时间复杂度为
O
(
n
8
)
O(n^8)
O(n8),空间复杂度为
O
(
1
)
O(1)
O(1)。这是一种不稳定的排序算法。



