插入排序步骤
- 记录要比较数据的下标index, 初始为1;
- 临时存储下标index的值,temp;
- 利用temp与index前的数据依此进行比较,如果temp<arr[index-1],则arr[index-1]后移一位,index - - ,直到temp >= arr[index-1] 或者 index == 0;
- 如果temp >= arr[index-1],则将arr[index]=temp;
- 如果index ==0 ,则将arr[index]=temp;
- 重复上述步骤
比较分析
插入排序代码
package com.sort.util;
public class InsertSort {
public static void insertSort(int arr[]) {
// 3 5 1 9 7 2
for(int i=1;i<arr.length;i++) {
int index = i; //记录比较数据的下标
int temp = arr[index]; //临时存储要比较的数据
while(index > 0 && temp < arr[index-1]) {
//当index>0且temp<前面已排序好的数据时,数据进行后移
arr[index] = arr[index-1];
index--;
}
//当index=0时,将临时存储数据temp赋值给arr[index]
arr[index] = temp;
}
}
public static void main(String[] args) {
int arr[] = {3,5,1,9,7,2};
InsertSort.insertSort(arr);
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
}
复杂度分析
- 最好的情况(数据已经有序)
比较次数:n-1 (每次循环只比较一次)
移动次数:0 - 最坏的情况
比较次数:2+3+4+……+n=(n+2)n/2 (每次都要比较到index==0)
移动次数:1+2+3+……+n-1=n*n/2
由此得出:直接插入排序的时间复杂度为 o(n^2)