原理:每次将排序中的元素,插入到前面已经排好序的有序序列中去,直到排序完成。
步骤:
-
第一步,a[0]为有序区,待排序区为a[1..n-1]。令i=1。
-
第二步,将a[1]与a[0]中元素比较,将小的元素放在第一个位置。
-
第三步,以此类推,直到待排序中全部元素插入完成为止。
例子:int[] arr={5,2,6,0,9};经行直接插入排序
图解:

过程:
-
初始状态:设5为有序,其中i为1,即:5 2 0 6 9
-
第一趟排序:第i个元素2比5小,则插入到5前面,然后i自增,即 : 2 5 0 6 9
-
第二趟排序:第i个元素0比2,5小,则插入到2前面,然后i自增,即:0 2 5 6 9
-
第三趟排序:第i个元素6比5大,则插入到5后面,然后i自增,即:0 2 5 6 9
-
第四趟排序:第i个元素9比6大,则插入到6后面,然后i自增,即:0 2 5 6 9
-
最终的答案为:0 2 5 6 9
时间复杂度:
1.在最好情况下,严格递增的数组,比较次数C和移动次数M为:
C = n - 1
M = 0
时间复杂度为O(n)。
2.在最坏情况下,严格递减的数组,比较次数C和移动次数M为:
C = n(n-1)/2
M = n(n-1)/2
时间复杂度为O(n2)。
综上,时间复杂度为:O(n2) 。
优缺点:
- 优点 : 稳定,相对于冒泡排序与选择排序更快;
- 缺点 : 比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量大的时候;
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | public class DirectSort { public static void main(String[] args) { // 直接插入排序1 int [] arr = { 8, 9, 5, 3, 6, 7, 16 }; int j; for ( int i = 1; i < arr.length; i++) { j = i; while (j > 0 && arr[j] < arr[j - 1]) { int temp = arr[j - 1]; arr[j - 1] = arr[j]; arr[j] = temp; j--; } } for ( int i = 0; i < arr.length; i++) { System. out .print(arr[i] + "," ); } // 直接插入排序2 arr = new int [] { 8, 9, 5, 3, 6, 7, 16 }; for ( int i = 1; i < arr.length; i++) { int index = 0; for ( int k = (i - 1); k >= 0; k--) { if (arr[i] > arr[k]) { index = k + 1; break ; } } int temp = arr[i]; for ( int n = i; n > 0 && n >= index; n--) { arr[n] = arr[n - 1]; } arr[index] = temp; } System. out .println( "---" ); for ( int i = 0; i < arr.length; i++) { System. out .print(arr[i] + "," ); } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端