算法定义直接插入排序是插入排序的一种,是一种简单的排序方法。它的基本操作是向排序列表中插入一条记录,得到一个新的排序列表,记录数加1。算法原理直接插入排序算法流程如下:1.第一个待排序序列的第一个元素视为有序序列,倒数第二个元素视为无序序列。2.从头到尾扫描未排序的序列,将每个扫描到的元素插入有序序列的合适位置。根据以上思路,可以通过exchange方式实现代码实现。从第二个数开始,确定要操作的数,找到要操作的数插入的位置。然后一路往前比较,如果当前数小于前一个数,则交换两个数,通过不断交换找到这个数合适的位置插入。交换法的代码如下:publicclassMain{//直接插入排序(insertionsort),交换法,平均时间复杂度O(n^2),最佳时间复杂度O(n),最坏时间复杂度O(n^2),空间复杂度O(1)publicstaticvoiddirectlyInsertSort(int[]arr){//从第二个数开始,确定要操作的数,为要操作的数找到要插入的位置(inti=1;i=1&&arr[j]=0&&arr[j]>temp){//向后移动数字arr[j+1]=arr[j];//向前移动下标--j;}//找到插入位置,将当前要插入的数字赋值在这里arr[j+1]=temp;}}}exchange方法其实和movement方法类似。movement方法没有实质性的效率提升,只是减少了一些不必要的交换操作,并没有降低时间复杂度和空间复杂度。算法效率插入排序是一种稳定的排序算法。最好的时间复杂度是O(n),就像数组有序一样,双层循环只经过第一层,第一层for循环是n阶时间,第二层while循环,数组已经有序,不会进入。最差的时间复杂度是O(n^2)。正好数组倒过来,两层循环就没有了。第一层for循环在n阶上,第二层while循环也在n阶上。每次都要交换n-k次,k是常数,常数项k还是n的阶数,所以是n*n=n^2。平均时间复杂度是O(n^2)。第一层for循环无论如何都要走。第二层的while循环也是平均在n阶上,因为假设数组有n个数和不同阶的数组,所以第二层的while循环还是和前面的表达式一样,交换n-k次,k是常量,走到常量项k,也就是n的阶数,所以还是n*n=n^2。空间复杂度是O(1),因为只用了有限个变量。算法稳定,因为直接插入排序的本质是通过交换实现插入,这里的交换判断没有相等判断。如果数组中的两个数相等,那么它们不会被交换,所以它们不存在于数组中。交换两个相等的数字。平均时间复杂度:O(n^2)最佳时间复杂度:O(n)最差时间复杂度:O(n^2)空间复杂度:O(1)参考资料直接插入排序动画来自:直接插入排序原文链接