上回书说道了冒泡排序以及局部冒泡排序,现在呢我们来谈一谈直接插入排序。
【基本思想】
每一趟将一个待排序的数字,按照其关键之大小,插入到已有序序列的适当位置,直到所有数字都已经插入完毕。
设有一个数组a[0...n-1],大致分为以下三步:
1.初始时刻认为a[0]有序,无序区为a[1...n-1]
2.将a[i]插入到有序区a[0...i-1],形成有序区a[0...i]
3.i++,重复以上步骤,直到i=n-1
【基本代码】
以下是排序的代码:
public class InsertSort{
public static void main(String[] args){
int array[]={9,4,5,6,8,3,2,7,10,1};
for(int i=1;i<array.length;i++)//第0位独自作为有序数列,从第1位开始向后遍历
{
if(array[i]<array[i-1])//0~i-1位为有序,若第i位大于i-1位,继续寻位并插入,否则认为0~i位也是有序的,忽略此次循环,相当于continue
{
int temp=array[i];//保存第i位的值
int k = i - 1;
for(int j=k;j>=0 && temp<array[j];j--)//从第i-1位向前遍历并移位,直至找到小于第i位值停止
{
array[j+1]=array[j];
k--;
}
array[k+1]=temp;//插入第i位的值
}
System.out.print("第" + i + "次排序结果:");
for(int a = 0; a < array.length; a++){
System.out.print(array[a] + "\t");
}
System.out.println("");
}
System.out.print("最终排序结果是:");
for(int a = 0; a < array.length; a++){
System.out.print(array[a] + "\t");
}
}
}
排序结果如下图:
从上图可以很明白的看出,每趟排序过后,在有序区相应位置插入后一数字,同时认为第一个数是一个有序区。如果这静态的图不能让你理清思路的话可以看这里。
【总结】
直接插入排序算法简单,易于理解和实现,它的时间复杂度为O(n^2),由于时间复杂度的原因,不适合用于数目较大的排序;空间复杂度为O(1),它是一个稳定的算法。