【C# 排序】插入排序法InsertionSort
概览
插入排序法(打牌)
算法思想:每次将一个待排序的元素按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成。
例如:元素13要排序时候,可以认为13之前元素都已经排序完成,此时只要把13与之前元素一 一比较,然后找到合理位置插入。
代码
空间复杂度:(O(1)
时间复杂度︰ O(n)~O(n2),可以利用折半查找,优化插入排序法。
稳定性:稳定
折半查找,优化插入排序法
当查找到元素和插入的元素相同,继续查找,直到low>hight,然后让low之后的所有元素右移一个位置(目的保证稳定性),插入元素。
当A[mid]=(A[0])时,为了保证算法的“稳定性”,应继续在mid)所指位置右边寻找插入位置。
比起“直接插入排序”,比较关键字的次数减少,但是移动元素的次数没变,整体来看时间复杂度依然是O(n^2)
如下图:
当找到60的位置,此时不能停止查找,应该继续查找
继续查找
low>high 停止查找,将low之后的所有元素后移一个位置
60的插入排序完成
代码如下:
链表的插入排序
C#代码
public static class Sort { /// <summary> /// 直接插入排序法 /// </summary> /// <param name="array"></param> public static void StraightInsertionSort(int[] array) { for (int i = 1; i < array.Length; i++) { int item = 0; item=array[i]; for (int j = i-1; j>=0 ; j--) { if (item < array[j]) { array[j+1] = array[j]; } else { array[j + 1] =item; break; } } } } /// <summary> /// 加入查找的改进,折半插入查找 /// </summary> /// <param name="array"></param> public static void StraightInsertionSort2(int[] array) { for (int i = 1; i < array.Length; i++) { int item = 0; item = array[i]; int mid ,low ,high; low =0; high = i - 1; mid = high / 2; ///折半查找位置 while (low <= high) { mid = (low + high)/2; if (item < array[mid]) { high = mid - 1; } else { low = mid + 1; } } //找到位置后,将[low,i-1]元素都后移一位,最后将元素插入到low的位置 for (int j = i - 1; j >= low ; j--) { array[j+1] = array[j ]; } array[low] = item; } } }
编程是个人爱好
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南