Java实现插入排序算法详解及优化

引言

插入排序(Insertion Sort)是一种简单直观的排序算法。虽然在大数据量下性能不如快速排序和归并排序等高级排序算法,但其在处理小规模数据集和部分有序数据时表现良好。本文将详细讲解如何使用Java实现插入排序算法,并结合图解和实例代码,帮助您全面理解这一基础排序算法。同时,我们还将探讨插入排序的优化方法,以提高其性能。

插入排序算法的原理

插入排序的基本思想是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

算法步骤

  1. 初始状态:从第二个元素开始,将每个元素插入到前面已经排序的子数组中。
  2. 从后向前扫描:对已排序序列,从后向前扫描,找到合适的位置插入当前元素。
  3. 重复上述步骤:直到所有元素均排序完成。

图解插入排序

以下是插入排序的可视化过程:

初始数组: 12, 11, 13, 5, 6
开始插入排序
已排序子数组: 12, 11
插入11到正确位置: 11, 12
已排序子数组: 11, 12, 13
插入13到正确位置: 11, 12, 13
已排序子数组: 11, 12, 13, 5
插入5到正确位置: 5, 11, 12, 13
已排序子数组: 5, 11, 12, 13, 6
插入6到正确位置: 5, 6, 11, 12, 13

Java实现插入排序

public class InsertionSort {/*** 实现插入排序算法* @param arr 待排序的数组*/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;// 将 arr[i] 插入到已排序部分while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j = j - 1;}arr[j + 1] = key;}}public static void main(String[] args) {// 初始化数组int[] arr = {12, 11, 13, 5, 6};// 调用插入排序方法insertionSort(arr);// 输出排序后的数组System.out.println("排序后的数组:");for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

插入排序的优化方法

二分查找优化

在标准插入排序中,插入元素时需要从后向前逐一比较,找到合适的位置插入。如果我们使用二分查找来确定插入位置,可以减少比较次数,从而提高性能。

public class BinaryInsertionSort {/*** 使用二分查找实现插入排序算法* @param arr 待排序的数组*/public static void binaryInsertionSort(int[] arr) {int n = arr.length;for (int i = 1; i < n; ++i) {int key = arr[i];int left = 0;int right = i;// 使用二分查找找到插入位置while (left < right) {int mid = (left + right) / 2;if (arr[mid] <= key) {left = mid + 1;} else {right = mid;}}// 将大于key的元素向右移动for (int j = i; j > left; j--) {arr[j] = arr[j - 1];}arr[left] = key;}}public static void main(String[] args) {// 初始化数组int[] arr = {12, 11, 13, 5, 6};// 调用二分查找插入排序方法binaryInsertionSort(arr);// 输出排序后的数组System.out.println("排序后的数组:");for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

哨兵优化

使用哨兵优化插入排序可以减少每次插入时的边界检查,从而提高性能。哨兵是一个特殊值,通常设置为数组的第一个元素或一个特殊的极小值。

public class SentinelInsertionSort {/*** 使用哨兵优化插入排序算法* @param arr 待排序的数组*/public static void sentinelInsertionSort(int[] arr) {int n = arr.length;// 找到数组中的最小值,并将其放在第一个位置作为哨兵int minIndex = 0;for (int i = 1; i < n; i++) {if (arr[i] < arr[minIndex]) {minIndex = i;}}// 交换最小值到第一个位置int temp = arr[0];arr[0] = arr[minIndex];arr[minIndex] = temp;// 从第二个元素开始排序for (int i = 1; i < n; ++i) {int key = arr[i];int j = i - 1;// 由于有哨兵,不需要检查边界while (arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}}public static void main(String[] args) {// 初始化数组int[] arr = {12, 11, 13, 5, 6};// 调用哨兵优化插入排序方法sentinelInsertionSort(arr);// 输出排序后的数组System.out.println("排序后的数组:");for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

结论

通过上述讲解和实例代码,我们详细展示了如何在Java中实现插入排序算法,并结合图解说明了其工作原理。同时,我们探讨了插入排序的优化方法,包括二分查找优化和哨兵优化,以提高其性能。

希望这篇博客对您有所帮助!记得关注、点赞和收藏哦,以便随时查阅更多优质内容!


如果您觉得这篇文章对您有帮助,请关注我的CSDN博客,点赞并收藏这篇文章,您的支持是我持续创作的动力!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/46251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java--数据结构】栈:不仅仅是数据存储,它是编程的艺术

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 栈 栈的方法介绍 入栈push 出栈pop和 瞄一眼peek 判空isEmpty和判满isFull 模拟实现栈 push入栈 pop出栈和peek 测试 使用泛型实现栈 测试 使用链表实现栈&#xff08…

怎么减少pdf的MB,怎么减少pdf的大小

在数字化时代&#xff0c;pdf文件因其格式稳定、跨平台兼容性强等特点而广受欢迎。然而&#xff0c;随着内容的丰富&#xff0c;pdf文件的大小也日益增大&#xff0c;给文件传输和存储带来了不少困扰。本文将为你介绍多种减小pdf文件大小的方法&#xff0c;帮助你轻松应对这一问…

跳表的简单学习

跳表&#xff08;SkipList&#xff09;学习 1. 什么是跳表&#xff1f; 基于“空间换时间”思想&#xff0c;通过给链表建立索引&#xff0c;使得链表能够实现二分查找。 跳表是可以实现二分查找的有序链表。 2. 从单链表到跳表 对于一般的单链表&#xff0c;在其中进行查…

GPT带我学-设计模式13-策略模式

概述 策略模式 例子 你可以创建一个策略工厂&#xff08;Strategy Factory&#xff09;来根据传入的 orgId 动态地选择合适的策略。以下是实现示例&#xff1a; 首先&#xff0c;定义策略接口和具体策略类&#xff1a; public interface CardPathStrategy {String generat…

c语言指针超详解——入门篇

文章目录 前言1. 内存与地址内存编址 2. 指针变量和地址取地址操作符 &指针变量和解引用操作符 *指针变量解引用操作符指针变量的大小 3. 指针变量类型的意义指针的解引用指针-整数void* 指针 4. const 修饰指针const 修饰指针指向的变量const 修饰指针变量 5. 指针运算指针…

本地部署,AnimeGANv3: 将现实世界照片转化为动漫风格

目录 引言 技术背景 架构与原理 实验结果与分析 应用实例 本地部署 运行结果 Photo to Hayao Style Photo to Shinkai Style more suprise 支持多种风格 结论 参考文献 GitHub - TachibanaYoshino/AnimeGANv3: Use AnimeGANv3 to make your own animation works, …

智驭数据:深剖朴素贝叶斯算法及其实战疆域拓展

在浩瀚的数据海洋中&#xff0c;机器学习如同一艘智能航船&#xff0c;引领我们探索未知的知识岛屿。而在这艘船的诸多算法装备中&#xff0c;朴素贝叶斯&#xff08;Naive Bayes&#xff09;算法以其简洁高效、逻辑清晰的特点&#xff0c;成为了处理分类问题的一把利器。本文将…

软件测试——web单功能测试

工作职责&#xff1a; 1.负责产品系统测试&#xff0c;包括功能测试、性能测试、稳定性测试、用户场景测试、可靠性测试等。 2.负责测试相关文档的编写&#xff0c;包括测试计划、测试用例、测试报告等。 3.负责自动化测试框架、用例的维护。 岗位要求&#xff1a; 1.熟练…

集成excel工具:自定义导入回调监听器、自定义类型转换器、web中的读

文章目录 I 封装导入导出1.1 定义工具类1.2 自定义读回调监听器: 回调业务层处理导入数据1.3 定义文件导入上下文1.4 定义回调协议II 自定义转换器2.1 自定义枚举转换器2.2 日期转换器2.3 时间、日期、月份之间的互转2.4 LongConverterIII web中的读3.1 使用默认回调监听器3.2…

JavaSE——集合框架二(4/6)-Map集合的遍历方式(键找值,键值对,Lambda)、Map集合案例(需求与分析,问题解决)

目录 Map集合的遍历方式 键找值 键值对 Lambda Map集合案例 需求与分析 问题解决 Map集合的遍历方式 键找值 先获取Map集合全部的键&#xff0c;再通过遍历键来找值。 键值对 把“键值对”看成一个整体进行遍历&#xff08;较为复杂&#xff09; Lambda JDK 1.8 开…

构建GitLab代码私有仓库

构建代码私有仓库 公司代码仓库一般都放在git上&#xff0c;但为了安全一般都不会放在开放的git上&#xff0c;都会搭建自己的仓库&#xff0c;今天就记录一下git搭建的过程。以下安装过程以centos7为例&#xff1a; 步骤一&#xff1a;安装并配置依赖项&#xff0c;同时打开ht…

iPhone 16 Pro系列将标配潜望镜头:已开始生产,支持5倍变焦

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 7月6日消息&#xff0c;据DigiTimes最新报道&#xff0c;苹果将在iPhone 16 Pro中引入iPhone 15 Pro Max同款5倍光学变焦四棱镜潜望镜头。 报道称&#xff0c;目前苹果已经将模组订单交至大立光电和玉…

带权重的随机选择算法

最终的结果是left的索引 代表大于等于target的最小索引&#xff0c; 用左边界的二分搜索原因是&#xff0c;如果没有目标值&#xff0c;left大于或者等于target class Solution {private int[] preSum;private Random randnew Random();public Solution(int[] w) {//写前缀和…

OpenGL笔记九之彩色三角形与重心插值算法

OpenGL笔记九之彩色三角形与重心插值算法 —— 2024-07-07 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记九之彩色三角形与重心插值算法1.运行3.main.cpp 1.运行 3.main.cpp 代码 #include <iostream>#define DEBUG//注意&#xff1a;glad…

推荐一款uniapp拖动验证码插件

插件地址&#xff1a;易盾验证码 - DCloud 插件市场 具体使用方式访问插件地址自行获取

2024.7.9.小组汇报postman分享会

文章目录 一、前言&#xff08;零&#xff09;安装&#xff08;一&#xff09;界面导航说明&#xff08;二&#xff09;发送第一个请求 二、基本功能&#xff08;一&#xff09;常见类型的接口请求(常见的接口有如下四种类型&#xff1a;1.查询参数的接口请求&#xff08;1&…

Java02--基础概念

一、注释 注释是在程序指定位置添加的说明性信息 简单理解&#xff0c;就是对代码的一种解释 1.单行注释 格式: //注释信息 2.多行注释 格式: /*注释信息*/ 3.文档注释 格式: /**注释信息*/ 注释使用的细节: 注释内容不会参与编译和运…

Linux 命令 —— top命令(查看进程资源占用)

文章目录 top 命令显示信息介绍top 命令使用 top 命令显示信息介绍 top 命令是 Linux/Unix 系统中常用的进程监控工具&#xff0c;可以实时动态显示系统中各个进程的资源占用情况&#xff0c;包括CPU、内存等。 进入 linux 系统&#xff0c;直接输入 top&#xff0c;回车&…

51单片机STC89C52RC——18.1 HC-SR04超声波测距

目的/效果 独立按键K1按下后开始测距&#xff0c;LCD显示距离&#xff08;mm&#xff09; 一&#xff0c;STC单片机模块 二&#xff0c;HC-SR04 超声波测距 2.1 HC-SR04 简介 HC-SR04超声波测距模块提供2cm~400cm的测距功能&#xff0c;精度达3mm。 2.2 时序 以上时序图表明…

HCIA学习笔记(6)-ACL+NAT

ACL&#xff1a;访问控制列表 访问控制-------在路由器的入或者出接口上&#xff0c;匹配流量&#xff0c;之后产生动作-----只有允许或拒绝 定义感兴趣流量------帮助其他策略去抓流量 匹配规则&#xff1a;至上而下&#xff0c;逐一匹配&#xff0c;上条匹配按照上条执行&…