插入排序的形式就很类似我们玩扑克牌的时候将拿到手里的牌往牌堆里面插一样,但是我们进行数组的排序的时候它实现的是将新拿到手的牌(待插入的元素)跟已有的牌(已插入的元素)进行依次比较,然后将它放到合理的位置,当我们再也拿不到牌时(到达数组元素的最右端时),插入排序也就完成了。
与选择排序不同的是,插入排序的效果很大程度上取决于输入的数组的元素顺序。对于一个随机排列且元素不重复的数组,最坏情况时(完全无需状态)需要进行N^2/2
次的比较和N^2/2
次的交换平均情况下插入排序需要(N^2)/4
次比较和 (N^2)/4
交换,最好情况下(本身就是一个排好序的数组)需要N-1次比较和0次交换。(借鉴参考一下《算法》第四版中的图)
插入排序比较适合于部分有序的数组,如下几种情况的数组是比较推荐使用插入排序的:
- 数组中的每个元素距离他的最终位置都不远;
- 一个有序的大数组接一个小数组;
- 数组中只有几个元素位置不确定;
package sort;
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] arr = {3,2,5,8,4};
insertSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void insertSort(int[] arr){
int length = arr.length;
for (int i=0;i<length;i++){
for (int j=i;j>0;j--){
if (arr[j]<arr[j-1])
swap(arr,j,j-1);
}
}
}
public static void swap(int[] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}