直接插入排序
Posted naloy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了直接插入排序相关的知识,希望对你有一定的参考价值。
原理
直接插入排序:每一步将一个待排序的记录,插入到前面已经排好序的有序列中去,直到插完所有元素为止。
流程
已知数组【3,1,4,2,7,8,6,5】,(当前元素和他之前的元素进行比较)
第一次排序:从索引1位置开始,比较 3 和 1,3 > 1,3 和 1 交换,结果为【1,3,4,2,7,8,6,5】
第二次排序,从索引2位置开始,比较 3 和 4, 3 < 4,不需要调整,结果仍为【1,3,4,2,7,8,6,5】
第三次排序:从索引3位置开始,比较 4 和 2,4 > 2, 4 和 2 交换【1,3,2,4,7,8,6,5】,
继续比较 3 和 2,3 > 2,3 和 2 交换 【1,2,3,4,7,8,6,5】,
继续比较 1 和 2,1 < 2, 不需要调整,结果为【1,2,3,4,7,8,6,5】
第四次排序,从索引4位置开始,比较 4 和 7,4 < 7 不需要调整,结果为【1,2,3,4,7,8,6,5】
第五次排序,从索引5位置开始,比较 7 和 8,7 < 8 不需要调整,结果为【1,2,3,4,7,8,6,5】
第六次排序,从索引6位置开始,比较 8 和 6,8 > 6,8 和6 交换【1,2,3,4,7,6,8,5】,
继续比较 7 和 6,7 > 6,7 和 6 交换,【1,2,3,4,6,7,8,5】,
继续比较 4 和 6,4 < 6,不需要调整,结果为【1,2,3,4,6,7,8,5】
第七次排序,从索引7位置开始,比较 8和 5,8 > 5, 8 和 5 交换【1,2,3,4,6,7,5,8】,
继续比较 7和 5, 7 > 5,7 和 5 交换【1,2,3,4,6,5,7,8】,
继续比较 6 和 5 ,6 > 5,6 和 5 交换【1,2,3,4,5,6,7,8】,
继续比较 4 和 5, 4 < 5 ,不需要调整,结果为【1,2,3,4,5,6,7,8】
排序结束。
复杂度
在最好的情况下,需要比较n-1 次,无序交换元素,时间复杂度为o(n), 在最坏的情况下,时间复杂度为o(n^2)
代码
package sequence; import java.util.Arrays; /** * 插入排序 */ public class InsertionSort { public static void insertionSort(int[] arr){ for(int i=1;i<arr.length;i++){ for (int j = i; j >0 ; j--) { if(arr[j]<arr[j-1]){ swap(arr,j,j-1); } } } System.out.println(Arrays.toString(arr)); } public static void swap(int[] arr,int i,int j){ arr[i] = arr[i] ^ arr[j]; arr[j] = arr[i] ^ arr[j]; arr[i] = arr[i] ^ arr[j]; } public static void main(String[] args) { insertionSort(new int[]{3,1,4,2,7,8,6,5}); } }
以上是关于直接插入排序的主要内容,如果未能解决你的问题,请参考以下文章
直接插入排序 ,折半插入排序 ,简单选择排序, 希尔排序 ,冒泡排序 ,快速排序 ,堆排序 ,归并排序的图示以及代码,十分清楚