java数据结构和算法——插入排序算法

一、插入排序算法的基本介绍

  • 插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。

二、插入排序算法的思想

  • 把n个待排序的元素看成为一个有序表和一个无序表
  • 开始时有序表中只包含一个元素,无序表中包含有n-1个元素
  • 排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。

三、插入排序算法的思路分析图

在这里插入图片描述

四、插入排序算法的应用示例需求

示例需求:有一群牛 , 颜值的打分分别是 101, 34, 119, 1 请使用插入排序从低到高进行排序

在这里插入图片描述

五、插入排序算法推导过程示例演示

1、代码

package com.rf.springboot01.dataStructure.sort;

import java.util.Arrays;

/**
 * @description: 插入排序算法推导过程示例演示
 * @author: xiaozhi
 * @create: 2020-08-07 08:51
 */
public class InsertSort {
    public static void main(String[] args) {
        int[] arr={101, 34, 119, 1};
        System.out.println("排序前的数组=================");
        System.out.println(Arrays.toString(arr));

        insertSort(arr);

        System.out.println("排序后的数组=================");
        System.out.println(Arrays.toString(arr));
    }

    public static void insertSort(int[] arr){


        //第一轮排序的原数素组{101, 34, 119, 1}
        int insertValue=arr[1];//定义一个待插入的数,第一次比较把34赋值给insertValue
        int insertIndex= 1-1;//定义一个待插入的数前面的数的下标

        //给insertValue 找到插入的位置
        //1. insertIndex >= 0 保证在给insertValue 找插入位置,不越界
        //2. insertValue < arr[insertIndex] 待插入的数,还没有找到插入位置
        while(insertIndex>=0  && insertValue < arr[insertIndex]){
            //将 arr[insertIndex] 后移,
            //即第一次找位置是把arr[0]=101赋值给arr[1]的位置,示例中数组展示为101, 101, 119, 1
             arr[insertIndex+1]=arr[insertIndex];
             insertIndex--;
        }
        //当退出while循环时,说明插入的位置找到, insertIndex + 1
        arr[insertIndex + 1] = insertValue;
        System.out.println("第1轮插入排序后的数组-----------------");
        System.out.println(Arrays.toString(arr));


        //第二轮排序以第一轮排序的结果为基础{34, 101, 119, 1}
        insertValue=arr[2];//定义一个待插入的数,第一次比较把119赋值给insertValue
        insertIndex= 2-1;//定义一个待插入的数前面的数的下标

        //给insertValue 找到插入的位置
        //1. insertIndex >= 0 保证在给insertValue 找插入位置,不越界
        //2. insertValue < arr[insertIndex] 待插入的数,还没有找到插入位置
        while(insertIndex>=0  && insertValue < arr[insertIndex]){
            //将 arr[insertIndex] 后移,
            arr[insertIndex+1]=arr[insertIndex];
            insertIndex--;
        }
        //当退出while循环时,说明插入的位置找到, insertIndex + 1
        arr[insertIndex + 1] = insertValue;
        System.out.println("第2轮插入排序后的数组-----------------");
        System.out.println(Arrays.toString(arr));


        //第三轮排序以第二轮排序的结果为基础{34, 101, 119, 1}
        insertValue=arr[3];//定义一个待插入的数,第一次比较把1赋值给insertValue
        insertIndex= 3-1;//定义一个待插入的数前面的数的下标

        //给insertValue 找到插入的位置
        //1. insertIndex >= 0 保证在给insertValue 找插入位置,不越界
        //2. insertValue < arr[insertIndex] 待插入的数,还没有找到插入位置
        while(insertIndex>=0  && insertValue < arr[insertIndex]){
            //将 arr[insertIndex] 后移,
            //第一次找位置是把arr[2]=119赋值给arr[3]的位置,示例中数组展示为34, 101, 119, 119
            //第二次找位置是把arr[1]=101赋值给arr[2]的位置,示例中数组展示为34, 101, 101, 119
            //第三次找位置是把arr[0]=34赋值给arr[1]的位置,示例中数组展示为34, 34, 101, 119
            arr[insertIndex+1]=arr[insertIndex];
            insertIndex--;
        }
        //当退出while循环时,说明插入的位置找到, insertIndex + 1
        arr[insertIndex + 1] = insertValue;
        System.out.println("第3轮插入排序后的数组-----------------");
        System.out.println(Arrays.toString(arr));
    }
}

2、运行main函数,运行结果如下:
在这里插入图片描述

六、插入排序算法的完整示例演示

1、代码

package com.rf.springboot01.dataStructure.sort;

import java.util.Arrays;

/**
 * @description: 插入排序算法完整示例
 * @author: xiaozhi
 * @create: 2020-08-07 09:13
 */
public class InsertSort2 {
    public static void main(String[] args) {
        int[] arr={101, 34, 119, 1};
        System.out.println("排序前的数组=================");
        System.out.println(Arrays.toString(arr));

        insertSort(arr);

        System.out.println("排序后的数组=================");
        System.out.println(Arrays.toString(arr));
    }

    public static void insertSort(int[] arr){
        int insertValue=0;
        int insertIndex=0;
        for(int i=1;i<arr.length;i++){
            //第一轮排序的原数素组{101, 34, 119, 1}
            insertValue=arr[i];//定义一个待插入的数,第一次比较把34赋值给insertValue
            insertIndex= i-1;//定义一个待插入的数前面的数的下标

            //给insertValue 找到插入的位置
            //1. insertIndex >= 0 保证在给insertValue 找插入位置,不越界
            //2. insertValue < arr[insertIndex] 待插入的数,还没有找到插入位置
            while(insertIndex>=0  && insertValue < arr[insertIndex]){
                //将 arr[insertIndex] 后移,
                //即第一次找位置是把arr[0]=101赋值给arr[1]的位置,示例中数组展示为101, 101, 119, 1
                arr[insertIndex+1]=arr[insertIndex];
                insertIndex--;
            }
            //当退出while循环时,说明插入的位置找到, insertIndex + 1
            //这里我们判断是否需要赋值
            if(insertIndex + 1 != i) {
                arr[insertIndex + 1] = insertValue;
            }
            System.out.println("第"+i+"轮插入排序后的数组-----------------");
            System.out.println(Arrays.toString(arr));
        }
    }


}

2、运行main函数,结果如下:
在这里插入图片描述

七、测试插入排序算法所消耗的时间示例

1、代码

package com.rf.springboot01.dataStructure.sort;

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

/**
 * @description: 插入排序耗时示例演示
 * @author: xiaozhi
 * @create: 2020-08-07 09:17
 */
public class InsertSort3 {

    public static void main(String[] args) {
        int arr[] = new int[100000];
        for(int i=0;i<100000;i++){//创建一个带有100000个随机数的数组
            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);

    }

    public static void insertSort(int[] arr){
        int insertValue=0;
        int insertIndex=0;
        for(int i=1;i<arr.length;i++){
            //第一轮排序的原数素组{101, 34, 119, 1}
            insertValue=arr[i];//定义一个待插入的数,第一次比较把34赋值给insertValue
            insertIndex= i-1;//定义一个待插入的数前面的数的下标

            //给insertValue 找到插入的位置
            //1. insertIndex >= 0 保证在给insertValue 找插入位置,不越界
            //2. insertValue < arr[insertIndex] 待插入的数,还没有找到插入位置
            while(insertIndex>=0  && insertValue < arr[insertIndex]){
                //将 arr[insertIndex] 后移,
                //即第一次找位置是把arr[0]=101赋值给arr[1]的位置,示例中数组展示为101, 101, 119, 1
                arr[insertIndex+1]=arr[insertIndex];
                insertIndex--;
            }
            //当退出while循环时,说明插入的位置找到, insertIndex + 1
            //这里我们判断是否需要赋值
            if(insertIndex + 1 != i) {
                arr[insertIndex + 1] = insertValue;
            }
        }
    }
}

2、运行main函数,运行结果如下:
在这里插入图片描述
在这里插入图片描述

本地计算机,win10系统,8G内存测试带有100000个随机数的数组,用插入排序算法耗时大约1秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小志的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值