序言
插入排序(Insertion Sort)是一种简单的排序算法,就像是我们在打扑克牌时,整理手中牌的过程。
一、基本原理
插入排序的基本思想是:将待排序的元素插入到已经有序的部分序列中合适的位置,直到所有元素都插入完毕,整个序列就变为有序序列。
二、算法步骤
- 从第二个元素开始(假设第一个元素已经是有序的),将当前元素(称为“待插入元素”)与前面已排序的元素依次比较。
- 例如,有一个数组
[5, 3, 4, 6, 1]
,首先从第二个元素3
开始。
- 例如,有一个数组
- 如果待插入元素小于前面的元素,则将前面的元素向后移动一位,为待插入元素腾出位置。
- 对于
[5, 3, 4, 6, 1]
,比较3
和5
,因为3 < 5
,所以将5
向后移动一位,数组变为[_, 5, 4, 6, 1]
,这里的_
表示空出的位置。
- 对于
- 继续向前比较,直到找到一个合适的位置,将待插入元素插入。
- 在上面的例子中,将
3
插入到空出的位置,数组变为[3, 5, 4, 6, 1]
。
- 在上面的例子中,将
- 重复步骤2和3,对后续的元素进行操作。
- 接着处理
4
,比较4
和5
,因为4 < 5
,将5
向后移动一位,数组变为[3, _, 5, 6, 1]
,再比较4
和3
,4>3
,所以将4
插入到3
后面的空出位置,数组变为[3, 4, 5, 6, 1]
。 - 以此类推,处理
6
时,因为6
大于前面的5
,所以6
的位置不变。当处理1
时,需要将1
依次与6
、5
、4
、3
比较并移动这些元素,最终数组变为[1, 3, 4, 5, 6]
,排序完成。
- 接着处理
三、代码实现(C++)
#include <iostream>
// 插入排序函数
void insertionSort(int arr[], int n) {
for (int i = 1; i < n; ++i) {
int key = arr[i];
int j = i - 1;
// 将比key大的元素向后移动
while (j >=