zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    JSON.parse与eval
    加密算法
    asp.net权限管理
    asp.net登录状态验证
    U3D Debug.log的问题
    yield(C# 参考)
    U3D 动态创建Prefab的多个实例
    U3D事件系统总结
    C#事件与接口
    C#泛型委托,匿名方法,匿名类
  • 原文地址:https://www.cnblogs.com/zhouzhiyao/p/12527191.html
Copyright © 2011-2022 走看看