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)