插入排序解释
插入排序很好理解,其步骤是 :先将第一个数据元素看作是一个有序序列,后面的 n-1 个数据元素看作是未排序序列。对后面未排序序列中的第一个数据元素在这个有序序列中进行从后往前扫描,找到合适的插入位置并插入到其中,每次有序序列的长度 +1。
重复这样的操作,将每个未排序序列中的元素插入到当前有序序列中合适的位置。直到未排序序列长度为 0,最后得到一个完整的有序序列,即为排序的结果。
(若当前插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
插入排序动态演示
我们以序列 [7, 6, 4, 5, 8, 2, 3] 为例进行动态演示
第一次插入
第二次插入
第三次插入
第四次插入
第五次插入
直接插入排序 时间复杂度
最优时间复杂度
假设每一层循环,当前未排序序列中的第一个元素(待插入元素)应当插入的位置都处于当前有序序列的末尾,只需要执行一次判断就可以了。
故 最优时间复杂度 为: O(n)
最坏时间复杂度
假设每一层循环,当前待插入元素应当插入的位置都在当前有序序列的首位,(设当前有序序列长度为 i )那么我们每一次线性查找比较的次数为 i , 并且每次将后面元素进行后移的次数也为 i。
故 最坏时间复杂度 为:
直接插入排序 核心代码
//插入排序
void InsertSort(vector<int> &v){
int n = v.size();
for(int i = 1; i < n; i++){
int key = v[i]; //当前需要插入的数
int j = i - 1; //j为已排序序列的末下标
while(j >= 0 && v[j] > key){
v[j + 1] = v[j]; //后移
j--;
}
v[j + 1] = key; //插入到已排序序列中的合适位置
}
}
优化方法 折半插入排序
线性查找每一次待插入元素在当前有序序列中合适的插入位置往往是比较低效的,因此我们自然会想到用 二分查找 来查找待插入元素合适的插入位置
标签:int,插入排序,pos,C++,插入,key,序列,排序 From: https://www.cnblogs.com/MAKISE004/p/16905341.html