package kpp.sort; /** * 当前待插入元素data[i],若data[i]>=data[i-1],则表示排序正常,i++处理下一个元素 * 若data[i]<data[i-1],先保存data[i]至temp,查找到适合插入的位置k,从k到i-1的元素顺序右移 * 将temp插入到k *
* 分析:
直接插入排序是稳定的排序。
文件初态不同时,直接插入排序所耗费的时间有很大差异。
若文件初态为正序,则每个待插入的记录只需要比较一次就能够找到合适的位置插入,故算法的时间复杂度为O(n),这是最好的情况。
若初态为反序,则第i个待插入记录需要比较i+1次才能找到合适位置插入,故时间复杂度为O(n2),这是最坏的情况。
直接插入排序的平均时间复杂度为O(n^2)。 * @author kpp */ public class InsertSort { public static void main(String[] args) { // TODO Auto-generated method stub int array[] = {5,3,2,67,1,8}; insertSort(array); for(int k :array){ System.out.println(k); } } private static int insertSort(int a[]){ int len = a.length; for(int i = 1;i < len;i++){ if(a[i] < a[i-1]){ int temp = a[i]; int j; //方法1:找到插入位置,统一向右移动 //找到插入位置 for(j = i-1;j >=0&&temp < a[j];j--); //统一向右移动 for(int k = i-1;k >= j+1;k--){ a[k+1]=a[k]; } //插入正确位置 a[j+1] = temp; //方法2:比较一个,移动一个 /*for(j = i-1;j >=0;j--){ if(temp < a[j]){ a[j+1] = a[j]; }else{ break; } } a[j+1] = temp;*/ } } return 0; } }