• [数据结构与算法]10 直接插入排序( Java 版)


    直接插入排序,当你看到这几个字的时候,首先第一想法是什么?

    我第一想法是在我斗地主的时候,比如我的牌是 5,J,K 下一张牌是 8 ,那我就直接把它放在 5 和 J 之间,此时手里面的牌就是 5,8,J,K 再来一张牌是 4 ,那就放在最前面,此时是 4,5,8,J,K 又来一张牌是 10 ,那就直接把它放在 8 和 J 之间,就是 5,8,10,J,K .(原谅我有点儿强迫症,一定要把牌从大到小码好才觉得顺眼)
    发现规律了嘛?在我手里面的牌是有序的,没有在我手里面的牌则是无序的,然后我一张一张的从无序的牌里面抽出来,然后和我手里面的牌进行比较,看看抽到的这张牌将它放在哪个位置比较好.
    如果找到了合适的位置,就直接插入进去就可以了.
    上面的这个过程,就是直接插入排序的体现.

    上面的描述比较口语化,咱们用术语来说一下原理(显得我比较有文化,哈哈哈):

    • 将 n 个待排序的元素看成是一个有序表和无序表
    • 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使得有序表从整体来看依然有序.
    • 第一趟比较前两个数,然后把第二个数按照大小插入到有序表中;第二趟将第三个数据与前面两个数据进行比较,将第三个数据插入到有序表合适的位置中
    • 按照这样的步骤依次进行下去,进行了 n-1 趟扫描以后,就整个待排序列排好了.

    从上面的步骤中,应该能够体会到,直接插入排序有两层嵌套循环.
    第一层是外循环,标识待比较的数值,也就是从无序表中取出来的那个值.
    第二层是内循环,是为了确定从无序表中取出的值的最终位置.
    但是外循环是从第二个数开始比较的,因为直接插入排序是将待比较的数值与它的前一个数值进行比较,如果没有前一个数值,也就没有直接插入排序这一说.

    OK ,理论知识补充完毕了,咱们来看看代码上是如何实现的:

    /**
     * 直接插入排序代码实现
     * @author 郑璐璐
     * @date 2020-1-25 11:39:13
     */
    public class StraightInsert {
        public static void straightInsert(int[] arr){
            // 定义变量
            int i , j , insertNote;
            // 从数组的第二个元素开始循环,将数组中的元素插入
            for (i=1;i<arr.length;i++){
                // 第一次循环,假设第 2 个元素为要插入的元素
                insertNote = arr[i];
                j = i - 1;
                while (j>=0 && insertNote < arr[j]){
                    // 如果要插入的元素小于第 j 个元素,就将第 j 个元素向后移动
                    arr[j+1] = arr[j];
                    j--;
                }
                // 要插入的元素大于第 j 个元素时,将要插入的数据插入到数组中
                arr[j+1] = insertNote;
            }
        }
        public static void main(String[] args){
            int[] arr ={1,8,95,45,78,56,23,456,741,16};
    
            straightInsert(arr);
    
            for (int i : arr) {
                System.out.println(i);
            }
        }
    }
    

    以上,就是想要分享的内容啦~
    感谢您的阅读哇
    有什么更好的实现方法更欢迎评论区交流~

  • 相关阅读:
    笔记
    Jquery 实现select 3级级联查询
    将properties文件的配置设置为整个Web应用的全局变量。
    jquery ajax异步提交表单数据
    tomcat : 虚拟路径映射
    使用bootstrap-select控件 搜索栏键入关键字动态获取后台数据
    Springboot解决ajax跨域的三种方式
    oracle中的递归查询语句
    oracle使用序列自定义固定长度id
    JVM内存空间
  • 原文地址:https://www.cnblogs.com/zll-0405/p/12534085.html
Copyright © 2020-2023  润新知