[数据结构与算法]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);
        }
    }
}

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

posted @ 2020-03-15 19:38  Developer_lulu  阅读(176)  评论(0编辑  收藏  举报