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

posted @ 2020-03-19 21:08  土堆碎念  阅读(187)  评论(0编辑  收藏  举报