java排序算法(六):直接插入排序
直接插入排序的基本操作就是将待的数据元素按其关键字的大小插入到前面的有序序列中
直接插入排序时间效率并不高,如果在最坏的情况下,所有元素的比较次数的总和为(0+1..n-1)= o(n^2).其他情况下也要考虑移动元素的次数。故时间复杂度是o(n^2)
直接插入空间效率很好,只需要一个缓存数据单元,也就是说空间复杂度是o(1)
直接插入排序是稳定的
直接插入排序在数据以有一定顺序的情况下,效率较好。但如果数据无规则,则需要移动大量的数据。其效率就和冒泡排序和选择排序一样差了。
算法描述
对一个有n个元素的数据序列,排序需要n-1趟插入操作
第一趟插入 将第二个元素插入到前面的有序子序列-此时前面只有一个元素。当然是有序的
第二趟插入 将第三个元素插入前面的有序子序列。前面两个元素都是有序的
第n-1趟插入将第n个元素插入前面的有序序列,前面n-1个元素是有序序列
代码实现
package com.spring.test; import java.awt.print.Printable; /** * 直接插入排序算法 */ public class InsertSortTest { public static void main(String[] args) { int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 }; print(data); insertSort(data); System.out.println("排序后的数组"); print(data); } public static void insertSort(int[] data){ for(int i=1;i<data.length;i++){ //缓存i处的元素值 int tmp = data[i]; if(data[i] < data[i-1]){ int j = i-1; //整体后移一格 while(j>=0 && data[j] > tmp){ data[j+1] = data[j]; j--; } //最后将tmp插入合适的位置 data[j+1] = tmp; print(data); } } } /** * 打印输出 */ public static void print(int[] data){ for(int i=0;i<data.length;i++){ System.out.print(data[i]+" "); } System.out.println(); } /** * 交换数据 */ public static void swap(int[] data,int i,int j){ if(i==j){ return; } data[i] = data[i]+data[j]; data[j] = data[i]-data[j]; data[i] = data[i]-data[j]; } }
运行结果