📜  递归插入排序的C程序(1)

📅  最后修改于: 2023-12-03 14:58:01.727000             🧑  作者: Mango

递归插入排序的C程序

插入排序是一种简单而有效的排序算法。它将待排序的元素分为已排序和未排序两个部分,每次将未排序元素插入到已排序部分中的正确位置。递归插入排序是插入排序的一种变体,它使用递归来完成排序操作。

算法描述

递归插入排序的算法描述如下:

  1. 如果数组长度小于等于1,则该数组已经是有序的,直接返回。
  2. 递归调用排序函数以对前 len-1 个元素排序。
  3. 将最后一个元素与前面的元素比较,将其插入到正确的位置。
  4. 返回已经有序的数组。
代码实现

以下是递归插入排序的C程序:

#include <stdio.h>

void rec_insertion_sort(int arr[], int len)
{
    if (len <= 1)
    {
        return;
    }
    rec_insertion_sort(arr, len - 1);
    int last = arr[len - 1];
    int j = len - 2;
    while (j >= 0 && arr[j] > last)
    {
        arr[j + 1] = arr[j];
        j--;
    }
    arr[j + 1] = last;
}

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

    rec_insertion_sort(arr, len);

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

    return 0;
}
代码解析
  1. rec_insertion_sort 函数中,如果数组长度小于等于1,则直接返回。
  2. 否则,递归调用 rec_insertion_sort 函数以对前 len-1 个元素排序。
  3. 接着,将最后一个元素与前面的元素比较,将其插入到正确的位置。
  4. 最后,返回已经有序的数组。
  5. main 函数中,定义一个整型数组 arr 并对其进行赋值。
  6. 然后,通过 sizeofarr[0] 计算数组的长度,并将数组长度作为参数调用 rec_insertion_sort 函数进行排序。
  7. 最后,使用 for 循环遍历排序后的数组并将其打印在屏幕上。
性能分析

递归插入排序的时间复杂度为 O(n^2),空间复杂度为 O(n)。和插入排序相比,递归插入排序具有较高的空间复杂度,因为递归调用需要在堆栈中维护额外的信息。但是,递归插入排序和插入排序一样,都是稳定排序算法,适用于小型数据集的排序。