046. 编写插入排序算法

插入排序(Insertion Sort)是一种简单直观的排序算法,它的工作原理类似于整理扑克牌。插入排序通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上通常使用in-place排序(即只需用到 O(1) 的额外空间的排序)。

C语言实现插入排序

#include <stdio.h>

// 插入排序函数
void insertionSort(int arr[], int n) {
    int i, key, j;
    for (i = 1; i < n; i++) { // 从第二个元素开始,假设第一个元素已经有序
        key = arr[i]; // 当前要插入的元素
        j = i - 1;

        // 将大于key的元素向后移动一个位置
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j = j - 1;
        }
        arr[j + 1] = key; // 插入key到正确的位置
    }
}

// 打印数组的函数
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {12, 11, 13, 5, 6};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("原始数组:\n");
    printArray(arr, n);

    insertionSort(arr, n); // 调用插入排序函数

    printf("排序后的数组:\n");
    printArray(arr, n);

    return 0;
}

代码说明

  1. 插入排序函数 insertionSort:

  2. 外层循环从第二个元素开始,假设第一个元素已经有序。

  3. 内层循环将当前元素(key)与已排序部分的元素进行比较,如果已排序部分的元素大于 key,则将该元素向后移动一个位置。

  4. 找到合适的位置后,将 key 插入到该位置。

  5. 打印数组函数 printArray:

  6. 用于打印数组的内容,方便查看排序前后的结果。

  7. 主函数 main:

  8. 定义了一个待排序的数组 arr。

  9. 调用 insertionSort 函数对数组进行排序。

  10. 打印排序前后的数组。

示例运行

输入:

原始数组:
12 11 13 5 6

输出:

排序后的数组:
5 6 11 12 13

插入排序的特点

  1. 简单易实现:插入排序的逻辑简单,实现起来容易。
  2. 稳定性:插入排序是一种稳定的排序算法,即相等元素的相对顺序不会改变。
  3. 时间复杂度:最坏情况下(数组完全逆序)的时间复杂度为 O(n2)。最好情况下(数组已经有序)的时间复杂度为 O(n)。
  4. 空间复杂度:插入排序的空间复杂度为 O(1),因为它只需要一个额外的变量用于存储当前要插入的元素。
  5. 适应性:插入排序对部分有序的数组排序效率较高,因为它在数组已经接近有序时,内层循环的比较和移动次数会显著减少。

插入排序虽然效率不高,但它的实现简单,适合用于小规模数据的排序,也适合用于教学和理解排序算法的基本原理。

视频讲解

BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)