多一些Aha Time,发现技术的美妙🍺|

啊原来是这样呀

园龄:8年3个月粉丝:3关注:9

【算法基础】9.十大排序算法——插入排序

参考资料

 插入排序算法详解https://blog.csdn.net/qq_35344198/article/details/106546399

 

直观理解

每次从无序集合中取出一个元素(一般就是取无序集合第一个,为的是留出空间存放有序集合向后的延伸),然后倒序遍历有序集合逐个比较、必要时交换,直到该元素处于有序集合中恰当的位置。

貌似是插入,其实是在有序集合中进行冒泡。

 

例子先行

复制代码
 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 void InsertSort(vector<int>& array);
 6 
 7 int main()
 8 {
 9     vector<int> arr{5,4,3,2,1};
10     int dataLen=arr.size();
11 
12     //插入排序
13     InsertSort(arr);
14 
15     //输出验证
16     for(int val:arr){
17         cout<<val<<endl;
18     }
19 
20     return 0;
21 }
22 
23 //默认排为升序
24 void InsertSort(vector<int>& array)
25 {
26     int start = 0;
27     int end = array.size() - 1;
28     
29     //it之前的认为已经有序,迭代it开始的所有元素
30     for (int it = start + 1; it <= end; it++)
31     {
32         int temp = array[it];//temp存储要新插入的值
33         int checkId;//插入排序时,前方被拿来比较的元素id
34 
35         //从当前待插元素的前一个元素开始比较,直到往前找到比当前元素更小的值
36         //比较完一次之后,再往前走到达再前一个元素
37         for (checkId = it - 1; checkId >= 0 && array[checkId] > temp; checkId--)
38         {
39             array[checkId + 1] = array[checkId];//较大值放靠后的位置
40         }
41 
42         //退出上边的for循环有两种可能
43         //1.在A组中找到了一个比temp小的元素,那么temp就可以插入在这个元素的后边,即array[j+1]的位置
44         //2.全部遍历完毕,在A组中没有找到比这个temp更小的元素,此时应该把temp插入在A组的最前边(array[0])
45         //由于此时j退出循环时候的值为-1,array[j+1]为要插入的位置
46         array[checkId + 1] = temp;
47     }
48 }
复制代码

 

总结提炼

时间复杂度是O(N^2)

空间复杂度为O(1)

不会改变相同元素的前后顺序,是一种稳定排序算法

 

拓展方向

 暂无

本文作者:OhOfCourse

本文链接:https://www.cnblogs.com/OhOfCourse/p/16916124.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   啊原来是这样呀  阅读(32)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起