1、对于给定的一组记录,初始时假设第一个记录自成一个有序序列,其余记录为无序序列。
2、接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,
3、直到最后一个记录插入到有序序列中为止。
仍以数组{38,65,97,76,13,27,49}为例,选择排序的具体步骤如下:
第一步插入38以后:【38】65 97 76 13 27 49
第二步插入65以后:【38 65】97 76 13 27 49
第三步插入97以后:【38 65 97】76 13 27 49
第四步插入76以后:【38 65 76 97】13 27 49
第五步插入13以后:【13 38 65 76 97】27 49
第六步插入27以后:【13 27 38 65 76 97】49
第七步插入49以后:【13 27 38 49 65 76 97】
2、接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,
3、直到最后一个记录插入到有序序列中为止。
仍以数组{38,65,97,76,13,27,49}为例,选择排序的具体步骤如下:
第一步插入38以后:【38】65 97 76 13 27 49
第二步插入65以后:【38 65】97 76 13 27 49
第三步插入97以后:【38 65 97】76 13 27 49
第四步插入76以后:【38 65 76 97】13 27 49
第五步插入13以后:【13 38 65 76 97】27 49
第六步插入27以后:【13 27 38 65 76 97】49
第七步插入49以后:【13 27 38 49 65 76 97】
程序代码如下:
public class Sort {
/**
* 插入排序
* @param a排序的数组
*/
public static void insertSort(int a[]){
int length=a.length; //数组长度
int j; //当前值的位置
int i; //指向j前的位置
int key; //当前要进行插入排序的值
//从数组的第二个位置开始遍历值
for(j=1;j
=0 && a[i]>key){
a[i+1]=a[i]; //将a[i]值后移
i--; //i前移
}//跳出循环(找到要插入的中间位置或已遍历到0下标)
a[i+1]=key; //将当前值插入
}
}
public static void main(String[] args) {
int[] a={1,2,3,5,3,5,3,9};
insertSort(a);
for(int i=0;i
下面对插入排序算法复杂度进行分析:
最好时间:O(n)
平均时间:O(n^2)
最坏时间:O(n^2)
辅助存储:O(1)
稳定性:稳定
备注:大部分已有序时较好