插入排序算法通过比较和插入来实现排序,具体如下:
1)假设第0个元素是排序好的,第1个元素与之经较,如果小于第0个,最把第0个元素后移一个,把第1个元素插入到第0个位置
2)接着,第2个元素,与前两个元素比较,把第3个插入到合适的位置
3)重复上述过程,直接最后一个元素插入到合适的位置,结束!
为了更好的理解下面通过一个实际例子来一步步的执行排序算法
举例说明:要排序数组:int[] a={101,99,118,112,85};
第一轮排序:
第一次排序:第1个元素和第0个元素比较,99小于101,把101后移一个位置,把99插入到第0个位置,完成后:99,101,118,112,85
第二次排序:第2个元素和第1、0个元素比较,118大于第1个元素结束,完成后:99,101,118,112,85
第三次排序:第3个元素和第2、1、0个元素比较,112小118,把118后移一个位置,接着再与101比较,112大于101结束,完成后:99,101,112,118,85
第四次排序:第4个元素和第3、2、1、0个元素比较,85小于118,118后移,再与112比较,112后移...,完成后:85,99,101,118,112
第一轮总共进行了4次比较, 排序结果: 85,99,101,112,118
下面看实现代码
public class InsertSort {public static void main(String[] args) {
int arr[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
int target;
int j;
//假定第一个元素被放到了正确的位置上
//这样,仅需遍历1 - n-1
for (int i = 1; i < arr.length; i++)
{
target = arr[i];
for(j=i;j>0;j--){
if(target<arr[j-1]){
arr[j] = arr[j-1];
}else{
break;//位置找到,j就是正确的位置,a[j]=target即可
}
}
arr[j]=target;
System.out.println();
for(int item:arr){//每一轮结束后最大的沉底
System.out.print(" "+item);
}
}
}
}
代码最难理解的地方是内层循环的结束条件,其实结合上述具体实例也是不难懂的,首先把第i个元素保存起来到target,然后再与i-1到0个元素依次比较,如果第target元素小,就是第i-1个元素后移到第i个位置,然后target再与第i-2个元素比较,直接target大于等于当前元素,结束!内存循环就是为了找到合适的位置!
时间复杂度分析:
最好的情况是,数据本来就有序,内层循环一进入就直接break,此时时间复杂度是O(n)
最坏的情况是,target比前面的元素都小,这时前面i-1个元素都要后移,时间复杂度是O(n^2)