zoukankan      html  css  js  c++  java
  • 插入排序

    本博客转载自漫画:什么是插入排序?


    1. 插入排序的思想

    插入排序的思想是:维护一个有序区,将数据一个一个插入到有序区的适当位置,直到整个数组都有序。

    给定无序数组如下:

    img

    把数组的首元素5作为有序区,此时有序区只有这一个元素:

    img

    第一轮

    让元素8和有序区的元素依次比较。

    8>5,所以元素8和元素5无需交换。

    此时有序区的元素增加到两个:

    img

    第二轮

    让元素6和有序区的元素依次比较。

    6<8,所以把元素6和元素8进行交换:

    img

    6>5,所以把元素6和元素5无需交换。

    此时有序区的元素增加到三个:

    img

    第三轮

    让元素3和有序区的元素依次比较。

    3<8,所以把元素3和元素8进行交换:

    img

    3<6,所以把元素3和元素6进行交换:

    img

    3<5,所以把元素3和元素5进行交换:

    img

    此时有序区的元素增加到四个:

    img

    以此类推,插入排序一共会进行(数组长度-1)轮,每一轮的结果如下:

    img

    2. 可优化点

    当插入一条数据到有序区域的时候,并不需要每次将数据进行两两交换。

    什么意思呢?让我们以第三轮举例:

    img

    在第三轮操作中,我们需要让元素3逐个与有序区的元素进行比较和交换,与8交换、与6交换、与5交换,最终交换到有序区的第一个位置。

    但是我们并不需要真的进行完整交换,只需把元素3暂存起来,再把有序区的元素从左向右逐一复制。

    第一步,暂存元素3:

    img

    第二步,和前一个元素比较,由于3<8,复制元素8到它下一个位置:

    img

    第三步,和前一个元素比较,由于3<6,复制元素6到它下一个位置:

    img

    第四步,和前一个元素比较,由于3<5,复制元素5到它下一个位置:

    img

    第五步,也是最后一步,把暂存的元素3赋值到数组的首位:

    img

    显然,这样的优化方法减少了许多无谓的交换。

    3. 代码实现

    
    public class InsertSort {
    
        public static void main(String[] args) {
            int[] array1 = new int[20];
            int[] array2 = new int[20];
            for (int i = 0; i < array1.length; i++) {
                array1[i] = (int) (Math.random() * 100);
            }
            array2 = Arrays.copyOf(array1, array1.length);
            System.out.println("生成随机数列1:" + Arrays.toString(array1));
            System.out.println("生成随机数列2:" + Arrays.toString(array1));
            insertSort(array1);
            insertSort(array2);
            System.out.println("排序随机数列1:" + Arrays.toString(array1));
            System.out.println("排序随机数列2:" + Arrays.toString(array2));
        }
    
        public static void insertSort(int[] array) {
            if (array == null || array.length == 1) {
                return;
            }
            for (int i = 1; i < array.length; i++) {
                int currentValue = array[i];
                int j = i - 1;
                for (; j >= 0 && array[j] > currentValue; j--) {
                    array[j + 1] = array[j];
    
                }
                array[j + 1] = currentValue;
            }
        }
    
    }
    
    

    4. 复杂度

    最坏时间复杂度:o(n^2) 最好时间复杂度:o(n)
    空间复杂度:s(1)

    人生的主旋律其实是苦难,快乐才是稀缺资源。在困难中寻找快乐,才显得珍贵~
  • 相关阅读:
    ThreadLocal源码分析与实践
    基于jdk1.8的LinkedList源码分析
    Spring编程式事务使用不当导致其他事务无法正常提交
    Spring计时器StopWatch使用
    工厂模式(Factory pattern)
    Spring Cloud Alibaba生态探索:Dubbo、Nacos及Sentinel的完美结合
    Spring Cloud Alibaba微服务生态的基础实践
    自己作图分析分布式技术架构演化的常用套路
    用一个实例项目重新认识分布式系统
    重温Java Web的技术细节
  • 原文地址:https://www.cnblogs.com/54chensongxia/p/11455224.html
Copyright © 2011-2022 走看看