Skip to content

希尔排序的原理详解与 C 语言实现

Posted on:2024年6月22日 at 18:55

希尔排序(Shell Sort),也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序的核心思想是通过比较距离较远的元素来进行排序,以减少数据量较大时的移动次数,从而提高效率。该算法由Donald Shell于1959年提出,因此得名。

希尔排序的工作原理

  1. 确定初始增量(gap):选择一个初始增量(一般为数组长度的一半)。
  2. 分组插入排序:将数组按照增量分组,对每一组进行插入排序。
  3. 减少增量:将增量减半,重复步骤2,直到增量为1,此时数组基本有序。
  4. 最终插入排序:增量为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;
}

代码解析

  1. shellSort函数

    • 使用一个for循环控制增量gap,初始为数组长度的一半,每次减半。
    • 内层for循环从gap位置开始遍历数组。
    • 将当前元素arr[i]暂存到temp变量中。
    • 使用另一个for循环进行插入排序,比较和交换间隔为gap的元素。
    • 结束插入排序后,将temp放置到正确的位置上。
  2. printArray函数

    • 用于打印数组元素,帮助查看排序前后的数组状态。
  3. main函数

    • 定义一个数组并初始化。
    • 打印排序前的数组。
    • 调用shellSort函数进行排序。
    • 打印排序后的数组。