目录
建议:1.学习算法最重要的是理解算法的每一步,而不是记住算法。
?????????? 2.建议读者学习算法的时候,自己手动一步一步地运行算法。
tips:本算法是在直接排序算法的基础上拓展而来的,读者先将直接排序算法的逻辑理清之后更容易理解本算法。当然,也可以直接学习本算法。
希尔排序(Shell Sort)是一种插入排序的改进版本,其核心思想是通过逐步缩小数组的间隔,对子序列进行插入排序,最终实现对整个数组的排序。
#include <stdio.h>
// 希尔排序函数
void shellSort(int arr[], int n) {
// 初始间隔设定为数组长度的一半
for (int gap = n / 2; gap > 0; gap /= 2) {
// 对每个子序列进行插入排序
for (int i = gap; i < n; i++) {
int temp = arr[i];
int j;
// 对子序列进行插入排序
for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
arr[j] = arr[j - gap];
}
// 插入当前元素到正确位置
arr[j] = temp;
}
}
}
// 打印数组元素
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {12, 34, 54, 2, 3};
int n = sizeof(arr) / sizeof(arr[0]);
printf("原始数组: \n");
printArray(arr, n);
// 调用希尔排序算法
shellSort(arr, n);
printf("\n排序后的数组: \n");
printArray(arr, n);
return 0;
}
?
这段C代码中,shellSort
函数实现了希尔排序算法,首先以一定的间隔(这里使用数组长度的一半)对数组进行分组,然后对每个子序列进行插入排序。随着排序的进行,不断缩小间隔,最终完成整个数组的排序。
在 main
函数中,我们创建一个简单的整数数组并调用 shellSort
函数进行排序,最后打印排序后的数组。希尔排序的优点在于相对于普通的插入排序,它在初始阶段就能够对数组的大部分乱序情况进行较快的修复,从而提高整体性能。
希尔排序(Shell Sort)是一种插入排序的改进版本,它通过逐步缩小子序列的间隔,对子序列进行插入排序,最终实现对整个数组的排序。希尔排序的时间复杂度与选取的间隔序列密切相关。
希尔排序的最坏时间复杂度取决于选用的间隔序列。一般而言,希尔排序的最坏时间复杂度为 ,这是由于在某些间隔下,对于逆序对的情况,插入排序需要多次移动元素,导致时间复杂度增加。
希尔排序的平均时间复杂度相对较难确定,因为它取决于选用的间隔序列。在平均情况下,希尔排序的时间复杂度可以达到 或 ,这比普通的插入排序 要好很多。
希尔排序的优劣取决于选用的间隔序列,而不同的间隔序列可能导致不同的性能。目前还没有找到一种通用的最优间隔序列,因此在实践中,人们常常根据经验或问题特点来选择适合的间隔序列。希尔排序在某些特定场景下仍然是一个有效的排序算法,特别是对于中小规模数据。
希尔排序的空间复杂度是 O(1),即常数级别的额外空间。
tips:对于考研的小伙伴而言,希尔排序的时间复杂度一般不是重点内容