【算法基础】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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步