Java插入排序算法实现方法例子

 更新时间:2024年10月08日 10:37:35   作者:小川_wenxun  
所谓排序,是将一组数据按照特定顺序重新排列的过程,稳定排序算法中相同键值的元素排序后保持原有顺序,直接插入排序和希尔排序是插入排序的两种形式,这篇文章主要介绍了Java插入排序算法实现的相关资料,需要的朋友可以参考下

排序的概念

排序:所谓的排序,就是使一串记录,按照某个或某些关键字的大小,递增或递减的排列起来的操作。

稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳 定的;否则称为不稳定的。

 常见的排序算法有下面四种:

  • 插入排序:直接插入排序,希尔排序
  • 选择排序:选择排序,堆排序
  • 交换排序:冒泡排序,快速排序
  • 归并排序:归并排序

这里主要介绍Java如何实现插入排序中的直接排序和希尔排序。

插入排序

基本思想:把待排序的记录按照其关键码值的大小逐个插入到一个已经拍好的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。生活中的例子,就像我们在完扑克牌的时候机型排序一样。

直接插入排序

思路:

直接插入排序的过程就像是有一组无序数据,用第二个元素先和第一个元素比较,如果第一个元素比第二个元素大,那么二者就交换位置,否则继续往后推,随着往后推,每一次前一个元素都要不断和之前排序过的元素进行比较。

 Sort类

public class Sort {
    /**
     * 时间复杂度:O(N^2)
     * 空间复杂度:O(1)
     * 稳定性:稳定的排序
     * @param array
     */
    //直接插入排序
    public static void insertSort(int[] arr){
        for (int i = 1; i < arr.length; i++) {
            int tmp = arr[i];
            int j = i-1;
            for (; j >= 0; j--) {
                if(arr[j] > tmp){
                    arr[j+1] = arr[j];
                }else{
                    arr[j+1] = tmp;
                    break;
                }
            }
            //确保j位置的数,也就是前一个数能换位成功
            arr[j+1] = tmp;
        }
    }
}

Test类 测试类

public class Test {
    public static void main(String[] args) {
        int[] arr = {12,6,59,45,73,26,2};
        System.out.println("排序前:" + Arrays.toString(arr));
        Sort.insertSort(arr);
        System.out.println("排序前:" + Arrays.toString(arr));
    }
}

输出结果为:

 关于i=1,且i < arr.length思路,因为数组是从0开始的,所以arr[6]的位置刚好是最后一位。

通过上面的动图我们不难发现,如果数组一开始越有序,直接插入排序的效率越高,这也为下面的哈希排序提供了思路。

稳定性

直接插入排序是稳定的,由上面图片能看到它是具有稳定性的,但如果是代码部分的 arr[j] > tmp 改为:arr[j] >=  tmp,以上面的2a和2b为例,它们的顺序就会发生变化。那么这还能说直接插入排序是稳定的吗?

当然能,因为 本身是一个稳定的排序,那么可以实现为不稳定的。

但是,如果一个排序 本身是不稳定的,那就不能实现稳定的排序。

哈希排序

哈希排序可以看作是直接插入排序的优化,先通过 gap来不断简化 其中的有序性,然后再用直接插入排序,越有序,直接插入排序的时间复杂度越小,速度越快。

通过间隔分为不同的组,组内进行排序,然后再缩短gap来进行再次排序。

代码为

public static void shellInsert(int[] array){
    int gap = array.length;
    while(gap > 1){
        gap /= 2;
        shell(array, gap);
    }
}

private static void shell(int[] array, int gap) {
    for (int i = gap; i < array.length; i++) {
        int tmp = array[i];
        int j = i-gap;
        for (; j >= 0; j-= gap) {
            if(array[j] > tmp){
                array[j+gap] = array[j];
            }else{
                array[j+gap] = tmp;
                break;
            }
        }
        array[j+gap] = tmp;
    }
}

到这里,插入排序中的直接插入排序和希尔排序就结束了,接下来我会继续给出剩下排序的思路和代码。

总结

到此这篇关于Java插入排序算法实现的文章就介绍到这了,更多相关Java插入排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot + thymeleaf 实现读取视频列表并播放视频功能

    SpringBoot + thymeleaf 实现读取视频列表并播放视频功能

    这篇文章主要介绍了SpringBoot + thymeleaf 实现读取视频列表并播放视频功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • JAVA SE包装类和泛型详细介绍及说明方法

    JAVA SE包装类和泛型详细介绍及说明方法

    这篇文章主要介绍了JAVA SE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-03-03
  • SpringBoot后端进行数据校验JSR303的使用详解

    SpringBoot后端进行数据校验JSR303的使用详解

    这篇文章主要介绍了SpringBoot后端进行数据校验JSR303的使用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Java实现WORD和PDF互相转换以及数据填充示例

    Java实现WORD和PDF互相转换以及数据填充示例

    本文介绍了如何使用Java实现WORD和PDF的互转以及数据填充功能,通过导入Aspose库并使用其工具类,可以轻松实现WORD和PDF模板的填充和转换,需要的朋友可以参考下
    2025-02-02
  • shell脚本运行java程序jar的方法

    shell脚本运行java程序jar的方法

    本篇文章主要介绍了shell脚本运行java程序jar的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Java双重MD5加密实现安全登录

    Java双重MD5加密实现安全登录

    MD5对密码进行加密存储是常见的一种加密方式,本文主要介绍了Java双重MD5加密实现安全登录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Java线程池用法实战案例分析

    Java线程池用法实战案例分析

    这篇文章主要介绍了Java线程池用法,结合具体案例形式分析了java线程池创建、使用、终止等相关操作技巧与使用注意事项,需要的朋友可以参考下
    2019-10-10
  • 图文详解OkHttp的超时时间

    图文详解OkHttp的超时时间

    HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽,OkHttp是一个高效的HTTP客户端,下面这篇文章主要给大家介绍了关于OkHttp超时时间的相关资料,需要的朋友可以参考下
    2021-10-10
  • 图文详解MyEclipse更换背景主题的方法

    图文详解MyEclipse更换背景主题的方法

    今天小编就为大家分享一篇关于MyEclipse更换背景主题的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • java实现简单的图书借阅系统

    java实现简单的图书借阅系统

    这篇文章主要为大家详细介绍了java实现简单的图书借阅系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论