希尔排序(Shell Sort),也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序的核心思想是通过比较距离较远的元素来进行排序,以减少数据量较大时的移动次数,从而提高效率。该算法由Donald Shell于1959年提出,因此得名。
希尔排序的工作原理
- 确定初始增量(gap):选择一个初始增量(一般为数组长度的一半)。
- 分组插入排序:将数组按照增量分组,对每一组进行插入排序。
- 减少增量:将增量减半,重复步骤2,直到增量为1,此时数组基本有序。
- 最终插入排序:增量为1时,对整个数组进行最后一次插入排序 。
希尔排序的时间复杂度在最坏情况下为O(n^2),但在大多数情况下性能优于简单的插入排序 。
C语言实现希尔排序
#include <stdio.h>
// 希尔排序函数
void shellSort(int arr[], int n) {
// 初始增量gap为数组长度的一半
for (int gap = n / 2; gap > 0; gap /= 2) {
// 从gap位置开始遍历数组
for (int i = gap; i < n; i++) {
// 将arr[i]暂存到临时变量temp
int temp = arr[i];
int j;
// 进行插入排序,比较间隔为gap的元素
for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
// 将arr[j - gap]移动到arr[j]
arr[j] = arr[j - gap];
}
// 将temp放置到正确的位置
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");
printArray(arr, n);
return 0;
}
代码解析
-
shellSort
函数:- 使用一个for循环控制增量
gap
,初始为数组长度的一半,每次减半。 - 内层for循环从
gap
位置开始遍历数组。 - 将当前元素
arr[i]
暂存到temp
变量中。 - 使用另一个for循环进行插入排序,比较和交换间隔为
gap
的元素。 - 结束插入排序后,将
temp
放置到正确的位置上。
- 使用一个for循环控制增量
-
printArray
函数:- 用于打印数组元素,帮助查看排序前后的数组状态。
-
main
函数:- 定义一个数组并初始化。
- 打印排序前的数组。
- 调用
shellSort
函数进行排序。 - 打印排序后的数组。