1. 概要说明

插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

Insertion sort is a simple sorting algorithm that works similar to the way you sort playing cards in your hands. The array is split into a sorted and an unsorted part. Values from the unsorted part are picked and placed at the correct position in the sorted part.

  • insertion /ɪnˈsɜːʃn/ 插入
  • sort /sɔːt/ 排序
  • algorithm /ˈælɡərɪðəm/ 算法
  • split /splɪt/ 分割(不规则动词)

2. 图示过程

插入排序图示

3. 动图演示

插入排序动画演示

4. 练习1

问题:以下程序执行后,数组中的元素是什么顺序?

#include <iostream>
using namespace std;

//sorted_right_index:目前已经排好序的数组的最大的下标。
//value: 待插入的元素。
void insert(int arr[], int sorted_right_index, int value)
{
    int pos = sorted_right_index;
    while (pos >= 0 && arr[pos] > value)
    {
        arr[pos + 1] = arr[pos];
        pos--;
    }
    arr[pos + 1] = value;
}

int main()
{
    int arr[8] = {3, 5, 7, 11, 13, 2, 9, 6};
    //前5(4+1)个元素已经排好,待插入元素2
    insert(arr, 4, 2);
    return 0;
}

2、

【NOIP 2018 普及组初赛 q08】以下排序算法中,不需要进行关键字比较操作的算法是( )。
A. 基数排序   B. 冒泡排序  
C. 堆排序   D. 直接插入排序  

5. C++实现插入排序

#include <iostream>
using namespace std;

void insertion_sort(int arr[], int len)
{
    for (int i = 1; i < len; i++)
    {
        int key = arr[i];
        int j = i - 1;
        while ((j >= 0) && (key < arr[j]))
        {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}

int main()
{
    int arr[8] = {3, 5, 7, 11, 13, 2, 9, 6};
    insertion_sort(arr, 8);
    for (int i = 0; i < 8; i++)
    {
        cout << arr[i] << " ";
    }
    return 0;
}

6. 编程练习

完成 插入排序的过程 c008-19

参考

  1. Khan Academy - Insertion Sort