输入: 打乱随机乱序列
输出:已被按序排列好的序列
基本思想: 从第二个元素起依次向前比较直到符合排序要求
核心思想:增量法
复杂度:O(n^2)[渐进上界], 确切说是插入排序的运行时间介于Ω(n)和O(n^2)
【归并排序】复杂度:o(nlogn)
示例:将乱序数字按正序递增输出
#include<iostream>
#include<vector>
using namespace std;
void insert_sort_by_increase(vector<int>& v)
{
int len = v.size();
for(int i=1; i <len; i++)
{
int key = v[i];
int j = i-1;
while((j>0 || j == 0) && (v[j]>key))
{
//swap obj
v[j+1] = v[j];
j--;
}
v[j + 1] = key;
}
}
void print_vector(vector<int>& v)
{
int len = v.size();
for(int i =0; i< len; i++)
{
cout << v[i] << endl;
}
}
int main()
{
vector<int> v{1,4,5,2,3,6};
insert_sort_by_increase(v);
print_vector(v);
return 0;
}
拓展
循环不变式子
循环不变式主体是不变式,也就是一种描述规则的表达式。其过程分三个部分:初始,保持,终止。认真分析该出入排序可知:在每次新的for循环开始排序前,v[i]前的元素全部按序排列完毕,并且其中包含元素全部属于原[0,v[i-1]]中的元素,此种规则也属于一种循环不变式实例
针对循环不变式A, 有如下过程成立:
初始化:循环的第一次迭代之前,A为真。
保持:如果循环的某次迭代之前它为真, 那么下次迭代之前它仍然为真。
终止 在循环终止时, 不变式为我们提供一个有用的性质, 该性质有助于证明算法是 正确的。
>>>Update on 20190621