直接插入排序的思想:每次把待排序的记录按照关键字插入到前面已经排好的记录集当中,直到结束!


给个简单示例:

待排序的数组为 : [2] 5 9 8 6 1

第一次      : [2 5] 9 8 6 1

第二次      : [2 5 9] 8 6 1

第三次      : [2 5 8 9] 6 1

第四次      : [2 5 6 8 9] 1

第五次      : [1 2 5 6 8 9]   //结束


核心代码:

for(int i=2,j;i<=numbers.length-1;i++){
	numbers[0]=numbers[i];
	j=i-1;
	while(numbers[0]<numbers[j]){
	    numbers[j+1]=numbers[j];
	    j--;
	}
	numbers[j+1]=numbers[0];
}

对比核心代码看算法实现步骤:

  1. 保存待排序记录到标志位number[0] 

  2. j=i-1,用来插入到之前已排好的记录集中

  3. 依次往前对比,不满足终止条件时就将j位置对应的当前记录后移,j向前移动一位

  4. 终止条件:标志位或者满足条件位置


该算法的分析:

  1. 稳定性:稳定

  2. 时间复杂度:

    原始数据正序时不需要移动,总比较次数:n-1,即O(n)

    原始数据逆序时频繁移动,总比较次数:(n*n+n-2)/2,即O(n*n)

    原始数据无序,第i趟的平均比较次数为:(i+1)/2,总次数为(n*n+3*n)/4,即O(n*n)

    故此数据越趋向于正序时,比较次数和移动次数最少(适用)

  3. 空间复杂度:只需要浪费一个单元,numbers[0];