欢迎访问宙启技术站
智能推送

C++ 中怎么实现希尔排序

发布时间:2023-05-15 07:44:16

希尔排序(Shell Sort)是由美国计算机科学家 Donald Shell 在 1959 年提出的一种排序算法。它不同于传统的排序算法,通过将数据分为多个子序列,分别进行插入排序,最后合并为一个有序序列,从而提高排序的效率。希尔排序在实践中已证明是一种高效的排序算法,经常被用作排序大型数据集。

希尔排序的工作原理是,将一组数据按照一定间隔分成若干个子集,对每个子集进行插入排序,逐渐缩小间隔直至为 1。这里的间隔可以自定义,通常会选择一个特定的序列,如希尔序列。希尔序列的定义为:h1, h2, …, hk,其中 hk = 1,而 hi-1 除以 i 是一个整数序列。最常用的希尔序列为:1, 4, 13, 40, 121, 364, 1093…。

下面让我们看一下如何在 C 语言中实现希尔排序:

1、定义希尔排序函数

void shellSort(int arr[], int n)
{
    //循环次数、增量step
    int i, j, step;
    int temp;

    for (step = n / 2; step >= 1; step /= 2)
    {
        //插入排序
        for (i = step; i < n; ++i)
        {
            temp = arr[i];
            for (j = i - step; j >= 0 && arr[j] > temp; j -= step)
            {
                arr[j + step] = arr[j];
            }
            arr[j + step] = temp;
        }
    }
}

在这个函数中,我们定义了循环次数 i、j 和增量 step。增量 step 初始为 n / 2,每次循环时将其除以 2,直到其值为 1。在循环中,我们将数据分为几个子序列,每个子序列都使用插入排序算法。

2、调用希尔排序函数

int main()
{
    int arr[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("Original array:
");
    printArray(arr, n);

    shellSort(arr, n);

    printf("Sorted array:
");
    printArray(arr, n);

    return 0;
}

在 main 函数中,我们定义了一个整数数组 arr,并使用 sizeof 操作符计算出其长度。然后我们调用了希尔排序函数,将 arr 数组作为参数传递给它。最后,我们调用了一个打印数组函数 printArray,以输出排序后的数组。

3、定义打印数组函数

void printArray(int arr[], int n)
{
    int i;
    for (i = 0; i < n; ++i)
    {
        printf("%d ", arr[i]);
    }
    printf("
");
}

这个函数很简单,只是循环遍历了整个数组,并将每个元素打印出来。

完整的代码如下所示:

#include <stdio.h>

void shellSort(int arr[], int n);
void printArray(int arr[], int n);

int main()
{
    int arr[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("Original array:
");
    printArray(arr, n);

    shellSort(arr, n);

    printf("Sorted array:
");
    printArray(arr, n);

    return 0;
}

void shellSort(int arr[], int n)
{
    //循环次数、增量step
    int i, j, step;
    int temp;

    for (step = n / 2; step >= 1; step /= 2)
    {
        //插入排序
        for (i = step; i < n; ++i)
        {
            temp = arr[i];
            for (j = i - step; j >= 0 && arr[j] > temp; j -= step)
            {
                arr[j + step] = arr[j];
            }
            arr[j + step] = temp;
        }
    }
}

void printArray(int arr[], int n)
{
    int i;
    for (i = 0; i < n; ++i)
    {
        printf("%d ", arr[i]);
    }
    printf("
");
}

使用希尔排序,在最优情况下排序时间复杂度为 O(n),在最坏情况下排序时间复杂度为 O(n log^2 n),但是通常情况下的时间复杂度介于这两种情况之间。虽然希尔排序并不是最快的排序算法,但它相对而言非常容易实现,程序代码量较小,排序效率较高,在大多数场合下都能够很好地工作。