Hark的数据结构与算法练习之插入排序
算法说明:
先是拿语言进行一下描述:
假如是做降序排序,那么从头开始扫描每个数字,使每个数字与它前面的若干数字进行比较,直接找到小于当前数字a(当前数字以a代替)的数字b(小于a的数字以b代替)。 然后将数字a插入到数学b的位置。将数字b到数字a前一位的数字向后移动一位。 至此,排序结束。
语言表述其实懂这个算法的人能会懂,不懂这个算法的人不太容易看懂,所以还是以例子做一下说明:
例如有一个数组int[] arrayData = { 5, 9, 6, 7, 4, 1, 2, 3 ,8},一共9个元素。
假设是降序排序。
先扫描第二个数,让它与它前面的数进行比较,这时前两个数是{5,9},9大于5,那么把9插入放到5的位置即arrayData[0],把5后移放到arrayData[1]
再扫描第三个数,这时因为前面排序所以前三个数就变成了{9,5,6},拿6先与前面的5比较,大于5,那么再往前扫描,与9比较,发现小于9,那么我们将6插入放到5的位置即arrayData[1],将5后移到arrayData[2]。
再扫描第四个数,这时前四个数就变成了{9,6,5,7}, 将7向前扫描进行比较,最终将7插入放到6的位置即arrayData[1],然后6后移放到arrayData[2],5后移放到arrayData[3]
以此类推,最后得出结果。
算法复杂度:
O(n2)
空间复杂度:
O(1)
代码:
使用语言:Java
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 | /* * 插入排序 */ public class InsertionSorting { public static void main(String[] args) { int [] arrayData = { 5 , 9 , 6 , 7 , 4 , 1 , 2 , 3 , 8 }; InsertionSortingMethod(arrayData); for ( int integer : arrayData) { System.out.print(integer); System.out.print( " " ); } } public static void InsertionSortingMethod( int [] arrayData) { int temp; int index; for ( int i = 1 ; i < arrayData.length; i++) { temp = arrayData[i]; index = i - 1 ; while (index >= 0 && arrayData[index] < temp) { arrayData[index + 1 ] = arrayData[index]; index--; } arrayData[index + 1 ] = temp; } } } |
结果:
1 | 9 8 7 6 5 4 3 2 1 |
论证算法复杂度:因为是双层循环,所以最坏算法复杂度是O(n2)。
论证空间复杂度:因为作为临时空间进行数据交换的是几个常量,所以空间复杂度是O(1)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程