插入排序(Insertion Sort)的基本操作是将一个记录插入到已经排序好的有序表中,从而得到一个新的、记录加1的有序表。插入排序是稳定的。
认定第一个元素为有序序列,后面的元素为未排序序列,取出第一个未排序序列元素,与有序序列的最后一个元素比较,即和有序序列的最大元素相比,如果比这个元素大,则直接插入在其后边,否则一直向前面的元素比较,直到找到合适的位置。后边的元素不断重复此步骤,直到所有元素排序完成。如果遇到与新插入元素相等的元素,则把插入元素放在相等元素的后面。
时间复杂度:O(n^2) 空间复杂度:O(1)
代码实现:
#include<iostream>
#include<vector>
//插入排序
using namespace std;
void InsertionSort(vector<int>& v, int len) {
for (int i = 1; i < len; i++) {//i为下标,从第二个元素开始
int temp = v[i];//定义一个哨兵,临时变量保存待排序元素
int j = i - 1;//j为i的前一个元素下标
while (j >= 0 && v[j] > temp) //当此元素还在容器内,且前面元素大于此元素temp
{
v[j+1] = v[j];
v[j] = temp;
j--;//不断向前比较
}
}
}
//遍历
void PrintVector(vector<int>&v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
int main() {
vector<int> v = { 5,0,3,4,6,1,9,7,8 ,2};
InsertionSort(v, v.size());
PrintVector(v);
}