算法介绍
插入排序是一种简单直观的排序算法,其基本思想是将一个待排序的元素逐个插入到已经排序好的部分序列中,直到全部元素都被插入完毕。如果你是一个打过扑克的人,那么这对你来说并不抽象,因为插入排序的过程,就是打扑克时抓牌的过程——每次抓一张牌,将这张新抓的牌插入到手里已经有的扑克牌序列的正确位置。
主要步骤
-
初始化: 将第一个元素视为已排序的部分序列。
-
遍历: 从第二个元素开始,逐个考察待排序的元素。
-
插入: 将当前待排序的元素插入到已排序序列的正确位置,确保插入后序列仍然有序。
-
重复: 重复步骤 2 和步骤 3,直到所有元素都被插入到已排序序列中
例如,对数组arr = {5, 2, 4, 6, 1, 3}进行插入排序,其过程(建议结合着代码看)为:
时间复杂度
时间复杂度为 O(n^2),空间复杂度为 O(1),是一种简单但效率一般的排序算法。
代码实现
#include<bits/stdc++.h>
using namespace std;
template<typename T>
void insertion_sort(T arr[], int len) {
// 下标为0的数据看作有序序列,从下标为1的数据开始插入排序
for (int i = 1; i < len; i++) {
int j = i - 1;
T k = arr[i];
// 将当前数据与其前侧数据比较,直到找到其第一个大于的数
while ((j >= 0) && (arr[j] > k)) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = k; // 将当前数据插入到正确的位置
}
}
int main() {
int arr[] = {61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62};
int len = (int) sizeof(arr) / sizeof(*arr);
insertion_sort(arr, len);
for (int i = 0; i < len; i++) {
cout << arr[i] << " ";
}
cout << endl;
float arrf[] = {17.5, 19.1, 0.6, 1.9, 10.5, 12.4, 3.8, 19.7, 1.5, 25.4, 28.6, 4.4, 23.7, 5.4};
int lenf = sizeof(arrf) / sizeof(*arrf);
insertion_sort(arrf, lenf);
for (int i = 0; i < lenf; i++) {
cout << arrf[i] << " ";
}
return 0;
}
代码执行结果展示:
其他算法实现
十大经典排序算法复杂度、应用场景总结 | 插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序、桶排序、计数排序-优快云博客
经典排序算法之基数排序详解|c++代码实现|简单易懂-优快云博客
经典排序算法之桶排序详解|c++代码实现|简单易懂-优快云博客
经典排序算法之堆排序详解|c++代码实现|什么是堆排序|如何代码实现堆排序-优快云博客
经典排序算法之快速排序|c++代码实现|什么是快速排序|如何代码实现快速排序-优快云博客
经典排序算法之归并排序|递归和迭代法代码均提供|c++代码实现|什么是归并排序|如何代码实现-优快云博客