从第二个元素开始,用这个元素依次与其前面的每一个元素比较,如大于该元素则将改元素向后移动一个位置直到找到比这个元素小的位置(或者到第一个结束)将这个元素放到改元素的后面即完成排序
算法图示
java代码实现
package com.leiht.sort; /** * 直接排序算法java简单实现 * * @author Leiht * @date 2015-11-10 */ public class SortDirect { public static void main(String[] args) { int[] numbers = { 56, 45, 78, 67, 99, 13, 34, 49, 55, 34, 12, 77, 1 }; System.out.println("排序之前:"); for (int i = 0; i < numbers.length; i++) { System.out.print(numbers[i] + " "); } // 直接插入排序 for(int i = 1; i < numbers.length; i++) { int temp = numbers[i]; int j; //从第i-1个,即前一个开始往前,如果比当前数据(temp)大,则向后移动一个位置, //直到比当前小,跳出循环 for(j = i-1; j >= 0; j--) { if(numbers[j] > temp) { numbers[j+1] = numbers[j]; }else { break; } } //将当前数据temp放到J+1的位置,J位置数据比当前数据小 numbers[j+1] = temp; } System.out.println(); System.out.println("排序之后:"); for (int i = 0; i < numbers.length; i++) { System.out.print(numbers[i] + " "); } } }
分析(稳定性与时间复杂度)
直接插入排序是稳定的排序,可以理解为当两个元素相同的时候不会交换两个元素的位置
文件初态不同时,直接插入排序所耗费的时间有很大差异。若文件初态为正序,则每个待插入的记录只需要比较一次就能够找到合适的位置插入,故算法的时间复杂度为O(n),这时最好的情况。若初态为反序,则第i个待插入记录需要比较i+1次才能找到合适位置插入,故时间复杂度为O(n2),这时最坏的情况。
直接插入排序的平均时间复杂度为O(n2)