栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

004排序算法之插入排序

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

004排序算法之插入排序

一、基本介绍

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

1、思路实现

插入排序(Insertion sorting)的基本思想:把n个代排序的元素看为一个有序和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序中取出第一个元素,把它的排序码依次与有序元素的排序码进行比较,将它插入到有序表中适当的位置,使之成为新的有序表。(感觉有点不好理解)

2、看一下图理解

当然看图就可以知道,这个当中第一个也是不用比较的,总体的也是实现数组大小减1的次数比较。

二、代码实现 1、推导版
package cn.mldn;

import java.util.Arrays;

public class insertSort {
    public static void main(String[] args) {
        int[] arr = {101,34,118,1};
        insertSort(arr);
    }

    public static void insertSort(int[] arr) {
        //使用逐步推导的方法讲解理解{101,34,118,1};
    //第一轮,给{101,34,118,1};=>{34,101,118,1};

        int insertVal = arr[1];//定义待插入的数
        int insertIndex = 1 - 1;//待插入数的索引

        //给insertVal 找到插入的位置,
        // 1)而insertIndex >= 0这句话主要是保证了不越界
        // 2)insertVal < arr[insertIndex]满足则待插入的数据还没有找到适当的位置,
        // 3)上面情况符合后这种情况就要arr[insertIndex]后移一个位置
        while(insertIndex >= 0 && insertVal < arr[insertIndex]) {
            arr[insertIndex + 1] = arr[insertIndex];//arr[insetIndex]
            insertIndex--;
            System.out.println("哈哈哈");
        }
        //当退出循环后,则插入的位置找到,insertIndex + 1,即上面的操作后,
        //              数组相当于这样了{101,101,118,1}
        arr[insertIndex + 1] = insertVal;
        System.out.println(Arrays.toString(arr));


    //第二轮
        insertVal = arr[2];
        insertIndex = 2 - 1;
        while(insertIndex >= 0 && insertVal < arr[insertIndex]) {
            arr[insertIndex + 1] = arr[insertIndex];//arr[insertIndex]
            insertIndex --;
            System.out.println("哈哈哈");
        }

        arr[insertIndex + 1] = insertVal;
        System.out.println(Arrays.toString(arr));
    //第三轮
        insertVal = arr[3];
        insertIndex = 3 - 1;
        while(insertIndex >= 0 && insertVal < arr[insertIndex]) {
            arr[insertIndex + 1] = arr[insertIndex];//arr[insertIndex]
            insertIndex --;
            System.out.println("哈哈哈");
        }

        arr[insertIndex + 1] = insertVal;
        System.out.println(Arrays.toString(arr));
    }
}

2、精简版
public class insertSort {
    public static void main(String[] args) {
        int[] arr = {101,34,118,1};
        insertSort(arr);
    }

    public static void insertSort(int[] arr) {

        System.out.println(Arrays.toString(arr));
        for (int i = 1; i < arr.length ; i++) {
            int insertVal = arr[i];
            int insertIndex = i - 1;
            while(insertIndex >= 0 && insertVal < arr[insertIndex]) {
                arr[insertIndex + 1] = arr[insertIndex];//arr[insertIndex]
                insertIndex --;
                System.out.println("哈哈哈");
            }
            arr[insertIndex + 1] = insertVal;
        }
        System.out.println(Arrays.toString(arr));
    }
}


3、从大到小版
public class insertSort {
    public static void main(String[] args) {
        int[] arr = new int[8];
        for (int i = 0; i < 8; i++) {
            arr[i] = (int)(Math.random()*80000);//生成0到80000的数
        }
        //2、输出时间
        Date date1 = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");//格式化
        String date1Str = simpleDateFormat.format(date1);
        System.out.println("排序前的时间" + date1Str);
        insertSort(arr);
        Date date2 = new Date();
        String date2Str = simpleDateFormat.format(date2);
        System.out.println("排序后的时间" + date2Str);
        System.out.println(Arrays.toString(arr));
    }

    public static void insertSort(int[] arr) {

        for (int i = 1; i < arr.length ; i++) {
            int insertVal = arr[i];
            int insertIndex = i - 1;
            //仅仅是改变一下insertVal < arr[insertIndex],为insertVal > arr[insertIndex]
            while(insertIndex >= 0 && insertVal > arr[insertIndex]) {
                arr[insertIndex + 1] = arr[insertIndex];//arr[insertIndex]
                insertIndex --;
            }
            arr[insertIndex + 1] = insertVal;
        }
    }
}

三、性能测试
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class insertSort {
    public static void main(String[] args) {
        int[] arr = new int[80000];
        for (int i = 0; i < 80000; i++) {
            arr[i] = (int)(Math.random()*80000);//生成0到80000的数
        }
        //2、输出时间
        Date date1 = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");//格式化
        String date1Str = simpleDateFormat.format(date1);
        System.out.println("排序前的时间" + date1Str);
        insertSort(arr);
        Date date2 = new Date();
        String date2Str = simpleDateFormat.format(date2);
        System.out.println("排序后的时间" + date2Str);
    }

    public static void insertSort(int[] arr) {

        for (int i = 1; i < arr.length ; i++) {
            int insertVal = arr[i];
            int insertIndex = i - 1;
            while(insertIndex >= 0 && insertVal < arr[insertIndex]) {
                arr[insertIndex + 1] = arr[insertIndex];//arr[insertIndex]
                insertIndex --;
            }
            arr[insertIndex + 1] = insertVal;
        }
    }
}

效果:仅仅是一秒就把80000个数据排序完成了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/346327.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号