思想
將數組分爲排序和未排序兩部分,每次從未排序部分選取一個元素,按順序插入到已排序部分。
想象你打牌的時候,手上拿的是已排序的拍,每次抓牌的時候,都是把抓到的牌(未排序)按順序插入到手上已排序的牌中。
插入的策略,交換相鄰元素或者移動插入。每進行一個相鄰交換,逆序對減一。
實現
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] nums = {5, 12, 5, 7, 1, 4, 7, 8, 9};
insertSort(nums);
System.out.println(Arrays.toString(nums));
}
public static void insertSort(int[] nums){
for (int i = 1; i < nums.length; i++) {
int insert_value = nums[i];
for (int j = i; j >= 1; j--) {
if(nums[j-1]>insert_value) nums[j] = nums[j-1];
else{
nums[j] = insert_value;
break;
}
}
}
}
}
複雜度
時間複雜度:選取未排序元素的時間爲常數,所以需要確認將其插入到排序元素中的時間。(這是關鍵)每交換相鄰元素,逆序對會減一,所以插入到排序元素的時間跟逆序對成正比。
所以,可以很容易得出,最壞時間複雜度爲(n-1)n/2,平均時間複雜度爲(n-1)n/4,最好時間複雜度爲1