zoukankan      html  css  js  c++  java
  • 插入排序(Insertion Sort)

    插入排序(Insertion Sort)

    原理:将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素。

    核心思想:取未排序区间中的元素,在已排序区间中找到合适的位置将其插入,并保证已排序区间的数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。

    算法描述:

    一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

    • 从第一个元素开始,该元素可以认为已经被排序;
    • 取出下一个元素,在已经排序的元素序列中从后向前扫描;
    • 如果该元素(已排序)大于新元素,将该元素移到下一位置;
    • 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
    • 将新元素插入到该位置后;
    • 重复步骤2~5。

    动画演示:

    java代码实现:

    import java.util.Arrays;
    public class InsertSort {
    
        public void InsertSorted(int[] arr){
            int len = arr.length;
            if(len <=1) {
                return;
            }
    
            //第一个元素作为已排序区间的值,所以索引从1开始
            for (int i = 1; i < len ; i++) {
                //取出当前序列中未排序的元素,即当前要和已排序区间比较的元素
                int current = arr[i];
                //在有序区间要从后往前扫描[下标]
                int preIndex = i - 1;
    
                while(preIndex >= 0 && arr[preIndex] > current){
                    arr[preIndex+1] = arr[preIndex]; // 往后移
                    preIndex--;
                }
                //当前值大于preindex的值,就在preindex+1 添加值
                arr[preIndex+1] = current;
            }
        }
        
        @Test
        public  void  testInsertSorted(){
            int[] arr = {4,85,45,35,7,15,48,26,38,77};
            System.out.println(Arrays.toString(arr));
            InsertSorted(arr);
            System.out.println(Arrays.toString(arr));
        }
    }
    

    算法分析:

    1:插入排序的时间复杂度是多少?

    • 如果要排序的数据已经是有序的,则为最好的时间复杂度O(n),最坏的情况是数据是倒序的,为O(n2),
    • 平均时间复杂度为O(n2)

    2:插入排序的空间复杂度是多少?

    • O(1)

    3:插入排序是稳定的排序算法吗?

    • 在插入排序中,对于值相同的元素,我们可以选择将后面出现的元素,插入到前面
      出现元素的后面,这样就可以保持原有的前后顺序不变,所以 插入排序是稳定的
      排序算法
  • 相关阅读:
    子类继承和调用父类的构造方法 (转)
    数组复制 System.arraycopy 与 Arrays.copyof()
    ArrayList的使用方法 (转)
    Eclipse 的debug 用法 (转)
    for each
    二维数组 排序 随机数 练习
    react 之 reflux 填坑
    react & vue 项目创建的方式
    数组实例的 copyWithin()
    es6的正则扩展笔记之修饰符
  • 原文地址:https://www.cnblogs.com/zhoujun007/p/13373306.html
Copyright © 2011-2022 走看看