序言
插入排序(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 >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
// 将key插入到合适的位置
arr[j + 1] = key;
}
}
// 打印数组函数
void printArray(int arr[], int n) {
for (int i = 0; i < n; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
int main() {
int arr[] = {5, 3, 4, 6, 1};
int n = sizeof(arr) / sizeof(arr[0]);
std::cout << "原始数组: ";
printArray(arr, n);
insertionSort(arr, n);
std::cout << "排序后的数组: ";
printArray(arr, n);
return 0;
}
四、时间复杂度和空间复杂度
- 时间复杂度
- 最好情况:当输入序列已经是有序的,插入排序只需要进行
n
−
1
n - 1
n−1 次比较操作,时间复杂度为
O
(
n
)
O(n)
O(n)。例如,数组
[1, 2, 3, 4, 5]
,每个元素只需要和它前面的元素比较一次,就可以确定它的位置。 - 最坏情况:当输入序列是逆序的,如
[5, 4, 3, 2, 1]
,对于第 i i i 个元素,需要比较和移动 i i i 次,总的比较和移动次数为 ∑ i = 1 n − 1 i = n ( n − 1 ) 2 \sum_{i = 1}^{n-1}i=\frac{n(n - 1)}{2} ∑i=1n−1i=2n(n−1),时间复杂度为 O ( n 2 ) O(n^{2}) O(n2)。 - 平均情况:时间复杂度也是 O ( n 2 ) O(n^{2}) O(n2),因为平均来说,插入一个元素需要比较和移动大约 n / 2 n/2 n/2 次。
- 最好情况:当输入序列已经是有序的,插入排序只需要进行
n
−
1
n - 1
n−1 次比较操作,时间复杂度为
O
(
n
)
O(n)
O(n)。例如,数组
- 空间复杂度:插入排序是一种原地排序算法,它只需要 O ( 1 ) O(1) O(1) 的额外空间来进行元素的交换和移动。因为它在排序过程中只使用了有限的几个临时变量来存储当前元素、位置等信息,而不需要额外的大量存储空间来复制整个数组等操作。
五、适用场景
插入排序适用于数据量较小或者基本有序的序列。因为它在处理基本有序的序列时效率较高,并且由于其简单的实现方式,对于小规模的数据排序是一个很好的选择。例如,在一些嵌入式系统或者对资源有限的环境中,当需要对少量数据进行排序时,插入排序可以发挥很好的作用。
标签:arr,int,插入排序,元素,C++,插入,算法,复杂度 From: https://blog.csdn.net/w_yunlong/article/details/143304526