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

    如果一个有序的数组,如何进行数据的插入?这个应该很简单,遍历数组然后一个个比较。找到插入位置后,将后面的数据进行后移就可以实现。

    那么插入排序的思想也和这玩意一样,只不过区别是它是在本身的数组上进行的拆入。

    核心思想就是这张图:

     只需要控制区间可以做到,类似新数组的真空地带。例如一开始的9肯定不用动,那么就是7和9之间的比较,那么数组的前两个就是真空区间.一个比较一个平移的动作就完成了这个一个排序中最关键的东西。与其说是移动元素不如说是元素的比较过程。

    public void insertionSort(int[] a){
            if (a.length<=1){
                return;
            }
    
    
            for (int i = 0; i < a.length; i++) {
                int num = a[i];
                int j = i-1;
                for (;j>=0;j--){
                    if (num<a[j]){
                        a[j+1] = a[j];
                    }
                }
                a[j+1] = num;
            }
    
        }
    

      核心的代码关键就是加粗的部分,j控制了区间,使用--的方法,因为这个区间内的数肯定是有序的,所以从后往前是最好的。而且也之间避免了前面空间的不足,如果是从前往后,需要放入第一位,那么就会很麻烦,后面的依然要进行移动,虽然使用System.copyxxxx这种方法可以很快,但是思想上会稍微麻烦一点。

    插入排序三个特点:是原地排序,也可以写成非原地排序。是一个稳定的算法,时间复杂度是O(n²)

  • 相关阅读:
    Web开发利器Webstorm导入多个文件夹或者项目
    js react 全选和反选
    nginx的配置文件 【nginx.conf】
    nginx 服务器重启命令,关闭
    Nginx反向代理新篇-使用location对多个URL做反向代理
    Windows下Nginx的安装与配置
    es6 递归 tree
    自定义table样式
    数据库(7)
    数据库(6)
  • 原文地址:https://www.cnblogs.com/SmartCat994/p/14102651.html
Copyright © 2011-2022 走看看