直接插入排序主要思路是:
初始序列为:
3 7 9 5 6 4 8 1 1 此时i=2 j=0
3 5 7 9 6 4 8 1 1 此时i=3 j=0
3 5 6 7 9 4 8 1 1 此时i=4 j=1
3 4 5 6 7 9 8 1 1 此时i=5 j=0
3 4 5 6 7 8 9 1 1 此时i=6 j=4
1 3 4 5 6 7 8 9 1 此时i=7 j=-1
1 1 3 4 5 6 7 8 9 此时i=8 j=-1
每次将一个待排序的数据,插入到前面已经排好序的序列之中,直到全部数据插入完成。
1、首先令i等于第二个元素,即a[1], j等于i之前的元素,即a[0],每次j向前遍历找比a[i]小的元素,如果到0都没找到,则需要将其插入到头部,如果找到则break,其他元素向后移动插入当前元素。
2、寻找a[j]<a[i]符合条件的元素,如果找到,则break。对于9 3 7 5 6 4 8 1 1 这个序列来说,前两部的调换如下
i = 1 ,j = 0 a[i] = 3 a[j] = 9, 不满足a[j]<a[i] ,则继续循环,此时j = -1,且j != i-1= 0,则产生元素调换 3 9 7 5 6 4 8 1 1
i = 2, j =1 a[i] = 7 a[j] =9 , 不满足a[j]<a[i] ,则继续循环,此时j = 0,且j != i-1= 1,则产生元素调换 3 7 9 5 6 4 8 1 1
3、当遍历完数组a时,数组a即为有序
直接插入排序的时间复杂度为O(n2),数据有序时不产生数据调换,复杂度为O(n),属于稳定排序,不需要辅助空间
public void InsertSort(int a[], int m)
{
int i,j,k,temp;
for(i = 1 ; i < m ; i++)
{
for( j = i-1 ; j >=0 ;j --)
if(a[j] < a[i])
break; //找到插入的位置
if( j !=i -1 ) //满足条件则插入元素
{
temp = a[i];
for( k = i-1 ; k >j ;k--)
{
a[k+1] = a[k];
}
a[k+1] = temp;
for (int p = 0; p <= 8; p++)
{
System.out.print(a[p]+" ");
}
System.out.println(" 此时i="+i+" j="+j+" k="+k);
System.out.println();
}
}
}
初始序列为:
9 3 7 5 6 4 8 1 1
3 7 9 5 6 4 8 1 1 此时i=2 j=0
3 5 7 9 6 4 8 1 1 此时i=3 j=0
3 5 6 7 9 4 8 1 1 此时i=4 j=1
3 4 5 6 7 9 8 1 1 此时i=5 j=0
3 4 5 6 7 8 9 1 1 此时i=6 j=4
1 3 4 5 6 7 8 9 1 此时i=7 j=-1
1 1 3 4 5 6 7 8 9 此时i=8 j=-1