C语言中的希尔排序(Shell Sort)是一种改进的插入排序算法,它通过将数组分割成多个子序列来进行排序,并逐步缩小子序列的长度,最终完成整个数组的排序。下面是一个使用C语言实现的希尔排序算法的示例:
void shell_sort(int arr[], int len) {
int gap, i, j, temp;
for (gap = len/2; gap > 0; gap /= 2) {
for (i = gap; i < len; i++) {
temp = arr[i];
for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
arr[j] = arr[j - gap];
}
arr[j] = temp;
}
}
}
解释一下这段代码:
首先,我们定义了一个 shell_sort 函数,它接受一个整数数组 arr 和数组长度 len 作为参数。
然后,我们定义了一些变量,包括 gap,i,j 和 temp。
gap 表示子序列的间隔,初始值为数组长度的一半,每次循环缩小为一半,直到最后为 1。
接下来,我们进入排序的主循环。外层循环控制子序列的间隔,内层循环遍历每个子序列中的元素。
在内层循环中,我们将当前元素保存到 temp 中,然后使用插入排序的思想将 temp 插入到已经排好序的子序列中。
j 初始值为 i,然后不断向前遍历子序列,将大于 temp 的元素向后移动一个位置,直到找到合适的插入位置。
最后,将 temp 插入到正确的位置上。
外层循环根据间隔不断缩小,直到间隔为 1,完成整个排序过程。
需要注意的是,希尔排序是一种非稳定排序算法,它的时间复杂度取决于选取的间隔序列。常见的间隔序列有希尔原始序列(n/2,n/4,…,1)和Hibbard序列(2^k - 1,2^k - 1,…,1)。