2. 插入排序

思想

將數組分爲排序和未排序兩部分,每次從未排序部分選取一個元素,按順序插入到已排序部分。

想象你打牌的時候,手上拿的是已排序的拍,每次抓牌的時候,都是把抓到的牌(未排序)按順序插入到手上已排序的牌中。

插入的策略,交換相鄰元素或者移動插入。每進行一個相鄰交換,逆序對減一。

實現

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章