六六力扣刷题之插入排序

“持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

前言

文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820…
种一棵树最好的时间是十年前,其次是现在
我知道很多人不玩qq了,但是怀旧一下,欢迎加入六脉神剑Java菜鸟学习群,群聊号码:549684836 鼓励大家在技术的路上写博客

叨絮

之前小六六一直觉得自己的算法比较菜,算是一个短板吧,以前刷题也还真是三天打鱼,两台晒网,刷几天,然后就慢慢的不坚持了,所以这次,借助平台的活动,打算慢慢的开始开刷,并且自己还会给刷的题总结下,谈谈自己的一些思考,和自己的思路等等,希望对小伙伴能有所帮助吧,也可以借此机会把自己短板补一补,希望自己能坚持下去呀

插入法排序原理

其实这个东西,理解起来还是蛮简单的,可能是因为这个只是数据结构的前面的东西,所以不是那么难,插入排序,其实每个人都有做过现实中的例子,大家肯定都打过牌吧,不知道大家摸牌的习惯是什么,小六六摸牌就喜欢把摸到的牌先放到一起(此时相当于一个无序的数组),然后一张张拿,从第二张开始,每次拿得怕牌都和手上的牌排序,到拿完最后一张牌,那小六六手上的牌就是全部排号序的了。

利用插入法对无序数组排序时,我们其实是将数组R划分成两个子区间R[1..i-1](已排好序的有序区)和R[i..n](当前未排序的部分,可称无序区)。插入排序的基本操作是将当前无序区的第1个记录R[i]插人到有序区R[1..i-1]中适当的位置上,使R[1..i]变为新的有序区。因为这种方法每次使有序区增加1个记录,通常称增量法。

图解:根据其原理,我们把该无序数列看成两个部分,我们不难看出图中,首先我们把第一位3看成是有序数列,剩下的作为无序数列,因为要把后面的无序数列中的数插入到前面有序数列,所以依次把后面的数抽出,在前面找到合适位置插入。如图,先抽出44,与前面比较,比3大放在3后面,再抽出38,与前面比较,比44小,比3大,所以插入到3后面。依次类推,直到最后的一个数也插入到前面的有序数列中。

代码实现

package com.github.brandonbai.pdfDemo.util;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

/**
 * @author 小六六
 * @version 1.0
 * @date 2020/5/14 17:59
 */
public class InsertSort {
    public static void main(String[] args) {
        //测试一下冒泡排序的速度O(n^2), 给80000个数据,测试
        //创建要给80000个的随机的数组
        int[] arr = new int[80000];
        for(int i =0; i < 80000;i++) {
            arr[i] = (int)(Math.random() * 8000000); //生成一个[0, 8000000) 数
        }


        Date data1 = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date1Str = simpleDateFormat.format(data1);
        System.out.println("排序前的时间是=" + date1Str);

        //测试插入排序
        insertSort(arr);

        Date data2 = new Date();
        String date2Str = simpleDateFormat.format(data2);
        System.out.println("排序后的时间是=" + date2Str);
        System.out.println(Arrays.toString(arr));

    }



        /**
             * @Des 插入排序
             * @Author 小六六
             * @Date 2020/5/15 10:20
             */
    public static void insertSort(int[] arr) {
       //先定义 需要插入的值和位置
        int intsertVal=0;
        int insertIndex=0;

       for (int i=1;i<arr.length;i++){
       //从第二个元素开始进行插入排序
           //要排序这个元素的值
           intsertVal=arr[i];
           //定义 要插入这个数前面一个数的下标
           insertIndex=i-1;
           while (insertIndex>=0&&intsertVal<arr[insertIndex]){
               //条件是 要插入的那个元素,和它前面排序好的元素去对比,找到它需要插入的位置
               //如果是比他小,说明这个当前这个要往后移动一个位置
               arr[insertIndex + 1] = arr[insertIndex];// arr[insertIndex]
               insertIndex--;
           }
           // 当退出while循环时,说明插入的位置找到, insertIndex + 1
           if(insertIndex + 1 != i) {
               arr[insertIndex + 1] = intsertVal;
           }

       }
    }
}

复制代码

结尾

大家都想下,这个应该不难

日常求赞

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是真粉

创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见

六脉神剑 | 文 【原创】如果本篇博客有任何错误,请批评指教,不胜感激 !

**

猜你喜欢

转载自juejin.im/post/7107225897186361351