直接插入排序的思想:每次把待排序的记录按照关键字插入到前面已经排好的记录集当中,直到结束!
给个简单示例:
待排序的数组为 : [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]; }
对比核心代码看算法实现步骤:
保存待排序记录到标志位number[0]
j=i-1,用来插入到之前已排好的记录集中
依次往前对比,不满足终止条件时就将j位置对应的当前记录后移,j向前移动一位
终止条件:标志位或者满足条件位置
该算法的分析:
稳定性:稳定
时间复杂度:
原始数据正序时不需要移动,总比较次数:n-1,即O(n)
原始数据逆序时频繁移动,总比较次数:(n*n+n-2)/2,即O(n*n)
原始数据无序,第i趟的平均比较次数为:(i+1)/2,总次数为(n*n+3*n)/4,即O(n*n)
故此数据越趋向于正序时,比较次数和移动次数最少(适用)
空间复杂度:只需要浪费一个单元,numbers[0];
原文地址:http://11291891.blog.51cto.com/11281891/1770872