插入排序的是十分常见的O(n^2)级别的排序算法,其排序思路如下:
一次循环使前n个数都为有序,嵌套的二次循环将第n个数插入到前n个数中合适的位置,我的实现代码如下:
public void insertsort(int[] a,int n)
{
for(int i=1;i<a.length;i++)
{
for(int j=i;j>0;j--)
{
if(a[j]<a[j-1])
{
int k;
k=a[j];
a[j]=a[j-1];
a[j-1]=k;
}
else {
break;
}
}
}
}
这个插入排序相对于选择排序有可以提前结束一层循环的特点,但是在实际实验中,其排序速度并没有选择排序快。我认为主要原因使插入排序需要进行两个数的交换操作,交换操作相对更加耗费时间。所以我下面的优化将三步的交换操作缩短为一次的赋值操作:
public void insertsort2(int[] a,int n)
{
for(int i=1;i<a.length;i++)
{
int k=a[i];
for(int j=i;j>0;j--)
{
if(a[j-1]>k){
a[j]=a[j-1];
}
else {
a[j]=k;
break;
}
}
}
}
这样就能使得排序的速度更快,另外插入排序在所排序数据趋近于有序时,其排序的时间复杂度也逐渐趋近于O(n)。这个特性十分重要。