📜  void InsertionSort(int * a, int n) { int i, j, x; for (i = 1; i < n; i++) { x = a[i]; j = 我 - 1;而 (j >= 0 && a[j] > x) { a[j + 1] = a[j]; j = j - 1; } a[j + 1] = x; } } (1)

📅  最后修改于: 2023-12-03 15:21:02.636000             🧑  作者: Mango

插入排序

插入排序是经典的排序算法之一,适用于各种大小的数据集合,在小数据集上表现优异。

算法说明

插入排序的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。其具体实现过程如下:

  1. 将第一个元素视为已经排好序的有序表;
  2. 依次将剩余的元素插入到已有的有序表中,将它们与有序表中的元素一一比较,找到合适的插入位置。

通常采用以下方式实现:

void InsertionSort(int *a, int n) {
  int i, j, x;
  for (i = 1; i < n; i++) {
    x = a[i];
    j = i - 1;
    while (j >= 0 && a[j] > x) {
      a[j + 1] = a[j];
      j = j - 1;
    }
    a[j + 1] = x;
  }
}

算法的时间复杂度为 O(n^2),在最坏情况下需要进行 O(n^2) 次比较和 O(n^2) 次移动。但是,在实际应用中,由于它的简单性、优美性以及较快的排序速度,在小数据集上表现优异,故在应用中仍具有重要地位。

示例

以下是对数组 {5, 3, 6, 2, 7, 1, 0, 9, 8, 4} 进行插入排序的过程演示:

Initial array: 5 3 6 2 7 1 0 9 8 4

i = 1: 3 5 6 2 7 1 0 9 8 4
i = 2: 2 3 5 6 7 1 0 9 8 4
i = 3: 2 3 5 6 7 1 0 9 8 4
i = 4: 2 3 5 6 7 1 0 9 8 4
i = 5: 1 2 3 5 6 7 0 9 8 4
i = 6: 0 1 2 3 5 6 7 9 8 4
i = 7: 0 1 2 3 5 6 7 9 8 4
i = 8: 0 1 2 3 5 6 7 9 9 4
i = 9: 0 1 2 3 4 5 6 7 9 9

最后的排序结果为 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9},证明了算法的正确性。

参考资料
  • 《算法导论》
  • 《算法》