插入排序
插入排序是一种非常直观的排序算法,它的基本思想是将数组分为已排序的前半部分和待排序的后半部分,每次把待排序部分的第一个元素,插入到已排序部分的对应位置中,直到全部记录都插入到已排序部分中。
插入操作分为两个步骤:
- 在已排序的部分中查找插入的位置,时间复杂度 O(n)(也可以用二分查找优化到 O(logn))。
- 插入时元素后移,时间复杂度 O(n)。
因此一次插入的时间复杂度为 O(n),一共执行 n−1 次,总时间复杂度为 O(n2)。
for (int i = 0; i < n; i++) {
for (int j = i; j >= 1; j--) {
if (a[j] < a[j - 1]) {
swap(a[j], a[j - 1]);
} else {
break;
}
}
}
上述代码中,内层循环是从大到小找第一个 aj≥ai 的位置 j,然后把 ai 放在 j+1 这个位置。我们边寻找,边调整元素的位置,相当于提前了元素后移的操作。
显然,插入排序是一种稳定的排序方法。
#include <iostream>
#include <algorithm>
using namespace std;
int a[1005];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < n; i++){
for (int j = i; j >= 1; j--){
if(a[j] < a[j - 1]){
swap(a[j], a[j - 1]);
} else {
break;
}
}
}
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
return 0;
}