主要内容 #
- 插入排序步骤
- 插入排序练习2
- 插入排序练习1
1. 插入排序步骤 #
1.1 算法思想 #
插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
插入排序操作类似于摸牌并将其从大到小排列。每次摸到一张牌后,根据其点数插入到确切位置。

如上图:表示的是摸到草花7后进行插入的过程。忽略最右边的草花10,相当于一开始7在最右边,然后逐个与左边的牌相比较(当然左边的牌早已排好顺序),将其放置在合适的位置。当摸到草花10后重复上述过程即可。
1.2 实现步骤: #
① 从第一个元素开始,该元素可以认为已经被排序 ② 取出下一个元素,在已经排序的元素序列中从后向前扫描 ③如果该元素(已排序)大于新元素,将该元素移到下一位置 ④ 重复步骤③,直到找到已排序的元素小于或者等于新元素的位置 ⑤将新元素插入到该位置后 ⑥ 重复步骤②~⑤

2. 插入排序练习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;
}
3. 插入排序练习2 #
题目描述
给定包含N个元素的数组a1,a2,a3,…,aN,利用插入排序将其排成升序,
每次拿出未排序部分中的第一个元素,插入到已排序部分中,排在首个不大于这个元素的后面。
输入
2行
第1行包含1个正整数N(1 < N <= 10000),代表数组元素个数
第2行包含N个整数,空格隔开。
输出
N-1行,既依次输出每趟选择排序后的数组。
样例输入
4
4 3 1 2
样例输出
3 4 1 2
1 3 4 2
1 2 3 4
参考程序
#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;
for(int k = 0; k < len; ++k){
cout << arr[k] << ' ';
}
cout << endl;
}
}
int main()
{
int arr[10001];
int N;
cin >> N;
for(int i = 0; i < N; ++i){
cin >> arr[i];
}
insertion_sort(arr, N);
return 0;
}