首页 > 编程语言 >插入排序详解及Java代码实现

插入排序详解及Java代码实现

时间:2024-06-02 11:33:34浏览次数:24  
标签:arr Java int 插入排序 元素 详解 排序 复杂度

在计算机科学中,排序是一种基本的操作,它广泛应用于各种数据处理场景。插入排序(Insertion Sort)是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

一、插入排序算法步骤

  1. 从第一个元素开始,该元素可以认为已经被排序;
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  5. 将新元素插入到该位置后;
  6. 重复步骤2~5,直到所有元素均排序完毕。

二、插入排序的时间复杂度与空间复杂度

1. 时间复杂度:

  • 最好情况:输入数组已经有序,此时的时间复杂度为O(n)。
  • 平均情况:时间复杂度为O(n^2)。
  • 最坏情况:输入数组为逆序,此时的时间复杂度为O(n^2)。

2. 空间复杂度:

由于插入排序是原地排序算法,不需要额外的存储空间,因此空间复杂度为O(1)。

三、Java代码实现插入排序

以下是一个插入排序算法的Java代码实现:
public class InsertionSort {

    // 插入排序函数
    public static void insertionSort(int[] arr) {
        int n = arr.length;
        for (int i = 1; i < n; ++i) {
            int key = arr[i]; // 将当前要插入的元素存储起来
            int j = i - 1;

            // 将大于key的元素向后移动
            while (j >= 0 && arr[j] > key) {
                arr[j + 1] = arr[j];
                j = j - 1;
            }
            arr[j + 1] = key; // 将key插入到正确的位置
        }
    }

    // 打印数组
    public static void printArray(int arr[]) {
        int n = arr.length;
        for (int i = 0; i < n; ++i) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

    // 主函数
    public static void main(String args[]) {
        int arr[] = {12, 11, 13, 5, 6};

        System.out.println("排序前的数组:");
        printArray(arr);

        insertionSort(arr);

        System.out.println("\n排序后的数组:");
        printArray(arr);
    }
}

四、代码详解

  1. insertionSort 函数是插入排序的主要实现部分。它首先假定数组的第一个元素已经排序,然后从第二个元素开始,将其视为一个待插入的“新元素”,与前面已经排序的元素进行比较,并找到合适的位置插入。

  2. insertionSort 函数中,我们使用了一个内部循环(由 while 语句控制)来将大于“新元素”的元素向后移动,直到找到合适的位置。

  3. printArray 函数用于打印数组,方便我们查看排序前后的结果。

  4. main 函数中,我们创建了一个待排序的数组,并调用了 insertionSort 函数对其进行排序。排序前后,我们都调用了 printArray 函数来打印数组的内容。

五、总结

插入排序是一种简单直观的排序算法,它适用于小规模数据的排序。虽然它的时间复杂度在平均和最坏情况下都是O(n^2),但在某些特定情况下(如数据已经部分有序或数据量很小),插入排序可能是一个不错的选择。在理解算法原理的基础上,我们可以编写出高效且易于理解的插入排序代码。

标签:arr,Java,int,插入排序,元素,详解,排序,复杂度
From: https://blog.csdn.net/qq_41256535/article/details/139370682

相关文章

  • Java毕业设计-基于springboot开发的企业oa管理系统-毕业论文(附毕设源代码)
    文章目录前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求/流程分析3、系统功能结构三、系统实现展示1、管理员模块的实现1.1用户信息管理1.2公告信息管理1.3客户关系管理1.4通讯录管理2、用户模块的实现2.1客户关系添加2.2通讯录添加2.3......
  • Java毕业设计-基于springboot开发的企业级工位管理系统-毕业论文(附毕设源代码)
    文章目录前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求/流程分析3、系统功能结构三、系统实现展示1、管理员模块的实现1.1员工信息管理1.2部门信息管理1.3工位信息管理1.4使用情况管理2、员工模块的实现2.1部门信息2.2工位分配管理四、......
  • javaScript基础一
    javaScript系列文章目录文章目录系列文章目录前言一、<script>元素二、语言基础1.1.区分大小写1.2.读入数据1.3注释1.4严格模式(strictmode)三、变量四、数据类型总结前言本文将简单的讲解JavaScript的基础预备知识一、<script>元素将JavaScript插入HTML的主要......
  • 【JUC】2-一把“锁”两个“并”三个“程”(JAVA多线程相关概念)
    1、一把锁(synchronized)2、两个并(并发并行)并发是在同一实体上的多个事件,是在一台处理器上同时处理多个任务,同一时刻,其实是只有一个时间在发生并行是在不同实体上的多个事件,是在多台处理器上同时处理多个任务,同一时刻,大家真的都在做事情,互不影响3、三个程(进程线程管程)进程......
  • linux 安装字体解决JAVA图形中文乱码问题
    1、在C:\Windows\Fonts\找到想要安装到linux的字体;如微软雅黑字体,它们可能的文件包括:2、将相关字体文件复制到指定文件夹“/usr/share/fonts/”3、执行字体安装:cd/usr/share/fonts/mkfontscalemkfontdir如果提示 mkfontscale:commandnotfound,需自行安装 yuminstallm......
  • linux 系统上图形生成错误 java.lang.NoClassDefFoundError: Could not initialize cl
    错误信息:02-Jun-202409:11:09.421SEVERE[Thread-32]org.apache.catalina.core.StandardWrapperValve.invokeServlet.service()forservlet[springDispatcherServlet]incontextwithpath[]threwexception[Handlerdispatchfailed;nestedexceptionisjava.lang.......
  • 【精品毕设】基于JavaEE的模拟火车售票系统设计与实现
                                                一可行性研究1.概述用户:某省市乃至全国开发单位:浙江海洋学院D02计算机(2)班 何升高系统名称:火车售票系统2.系统目标 在2005年5月1日之前,开发一个火车售票系统,实现对火车......
  • 多旋翼+发电机:国债应急系留照明无人机技术详解
    多旋翼+发电机技术的应急系留照明无人机是一种集成了先进飞行技术、发电技术和照明技术的无人机系统。这种无人机具有高度的灵活性、移动性和适应性,能够在各种复杂环境下迅速部署,为夜间搜救、救援等应急任务提供高效、可靠的照明支持。无人机参数:             ......
  • JVM学习-详解类加载器(一)
    类加载器类加载器是JVM执行类加载机制的前提ClassLoader的作用ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类型对应的java.lang.Class对象实例,然后交给Java虚......
  • 指针的详解延续二
     第一篇移步CSDNhttps://mp.csdn.net/mp_blog/creation/editor/139301675 第二篇移步CSDN​​​​​​​​​​​https://mp.csdn.net/mp_blog/creation/editor/139329194目录一、指针数组二、字符指针变量三、数组指针变量四、二维数组传参的本质五、函数指针变量 ......