java算法:插入排序

这里写目录标题

  • 基本使用
  • 优缺点
  • 尝试优化
    • 二分查找插入
    • 减少交换操作

基本使用

插入排序是一种简单直观的排序算法,它的工作原理是将待排序的数组分为已排序和未排序两部分,逐步将未排序部分的元素插入到已排序部分中的正确位置,直到整个数组有序。

插入排序的详细步骤:

  • 初始状态:将数组的第一个元素视为已排序部分,其余元素视为未排序部分。
  • 遍历未排序部分:从数组的第二个元素开始,逐个遍历未排序部分的元素。
  • 插入操作:将当前遍历到的元素插入到已排序部分的正确位置。为了找到正确的位置,从当前元素开始,逐个将已排序部分中的元素向后移动,直到找到合适的位置插入当前元素。
  • 重复步骤2和3:重复执行遍历未排序部分和插入操作,直到未排序部分的所有元素都被插入到已排序部分。
public class InsertionSort {public static void main(String[] args) {int[] arr = {7, 2, 1, 6, 8, 5, 3, 4};insertionSort(arr);System.out.println("Sorted array: " + Arrays.toString(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; // 已排序部分的最后一个元素的索引// 将已排序部分中比当前元素大的元素向后移动while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}// 插入当前元素到正确的位置arr[j + 1] = key;}}
}

插入排序的时间复杂度为O(n^2),其中n是数组的长度。它是一种稳定的排序算法,并且在小规模数据或部分有序的数据上表现良好。然而,在处理大规模数据时,插入排序的性能可能不如其他更高效的排序算法。

优缺点

优点:

  • 简单易实现: 插入排序算法的实现相对简单,易于理解和编写。
  • 原地排序: 插入排序只需要使用常数级别的额外空间,可以在原地进行排序,不需要额外的辅助空间。
  • 稳定性: 插入排序是一种稳定的排序算法,相等元素的相对顺序在排序后不会改变。

缺点:

  • 较慢的平均和最坏时间复杂度:插入排序的平均时间复杂度为 O ( n 2 ) O(n^2) O(n2),最坏情况下的时间复杂度也是 O ( n 2 ) O(n^2) O(n2),其中n是待排序元素的数量。这使得插入排序在处理大规模数据时效率较低。
  • 对逆序数据的排序效率低:如果待排序的数据已经部分有序或者是逆序的,插入排序的效率会明显降低。当逆序度较高时,需要进行大量的元素移动操作,导致性能下降。
  • 不适用于大规模数据: 由于插入排序的时间复杂度较高,它在处理大规模数据时的性能表现不如其他更高级的排序算法(如快速排序、归并排序等)。
  • 不适用于链式结构: 插入排序需要频繁地访问和移动元素,对于链式结构来说,访问和移动的成本较高,因此不适用于链表等非随机访问结构的排序。

尝试优化

插入排序是一种简单但效率较低的排序算法,但可以通过一些优化策略来提高其性能。

二分查找插入

在传统的插入排序中,为了找到当前元素的正确插入位置,需要逐个比较已排序部分中的元素。然而,我们可以使用二分查找的方法来减少比较的次数。具体步骤如下:

  • 将当前元素与已排序部分的中间元素进行比较。
  • 如果当前元素小于中间元素,则继续在已排序部分的前半部分进行二分查找。
  • 如果当前元素大于等于中间元素,则继续在已排序部分的后半部分进行二分查找。最终找到插入位置后,将已排序部分中插入位置后的元素都向后移动一位,并将当前元素插入到正确位置。

使用二分查找插入可以减少比较的次数,从而提高插入排序的性能。这种优化方法将插入排序的时间复杂度降低到 O ( n l o g n ) O(nlogn) O(nlogn)

public class InsertionSort {public static void main(String[] args) {int[] arr = {7, 2, 1, 6, 8, 5, 3, 4};insertionSort(arr);System.out.println("Sorted array: " + Arrays.toString(arr));}public static void insertionSort(int[] arr) {int n = arr.length;for (int i = 1; i < n; i++) {int key = arr[i]; // 当前要插入的元素int j = binarySearch(arr, key, 0, i - 1); // 使用二分查找找到插入位置// 将已排序部分中插入位置后的元素都向后移动System.arraycopy(arr, j, arr, j + 1, i - j);// 插入当前元素到正确的位置arr[j] = key;}}public static int binarySearch(int[] arr, int key, int start, int end) {while (start <= end) {int mid = start + (end - start) / 2;if (arr[mid] == key) {return mid;} else if (arr[mid] < key) {start = mid + 1;} else {end = mid - 1;}}return start;}
}

减少交换操作

在传统的插入排序中,为了将当前元素插入到正确的位置,需要将较大的元素逐个向后移动,直到找到合适的位置。然而,我们可以通过将较大的元素向右移动一位,并将当前元素直接插入到正确位置来减少交换操作。具体步骤如下:

  • 将当前元素存储在临时变量中。
  • 向右移动较大的元素,直到找到合适的位置。
  • 将当前元素插入到正确的位置。

这种优化方法减少了交换操作的次数,从而提高了插入排序的性能。

public class InsertionSort {public static void main(String[] args) {int[] arr = {7, 2, 1, 6, 8, 5, 3, 4};insertionSort(arr);System.out.println("Sorted array: " + Arrays.toString(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; // 已排序部分的最后一个元素的索引// 将较大的元素向右移动一位while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}// 插入当前元素到正确的位置arr[j + 1] = key;}}
}

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

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

相关文章

ffmpeg的部署踩坑及简单使用方式

ffmpeg的使用方式有以下几种: 使用原生安装包 直接在ffmpeg官网上下载安装该软件,加入到环境变量中就可以使用了 优点:简单,灵活,代码中也不用添加其他第三方的包 缺点:需要手动安装ffmpeg,这点比较麻烦 部署-windows 在windows环境下,有时就算加入到了环境变量,…

你知道花洒其实起源于中国古代吗?

花洒作为日常生活中不可或缺的一部分&#xff0c;其发展历程不仅见证了人类文明的进步&#xff0c;也反映了生活美学的演变。从最初的简单构想到现代的智能化设计&#xff0c;花洒的变迁历程是一部生动的人类生活史。 早在隋朝时期&#xff0c;我们的祖先就已经有了花洒的初步构…

【Go语言】Go语言中的接口类型

Go语言中的接口类型 接口&#xff08;interface&#xff09;定义了一个对象的行为规范&#xff0c;只定义规范不实现&#xff0c;由具体的对象来实现规范的细节。 1.接口类型 1.1 接口类型的说明 Go语言中 接口&#xff08;interface&#xff09; 是一种抽象的类型。 接口…

《纪元 1800》好玩吗? 苹果电脑能玩《纪元 1800》吗?

《纪元1800》是一款不错的策略游戏&#xff0c;这款游戏因为画面和玩法独特深受玩家们的喜爱。下面我们来看看《纪元 1800》好玩吗&#xff0c;苹果电脑能玩《纪元 1800》吗的相关内容。 一、《纪元1800》好玩吗 《纪元1800》是一款备受瞩目的策略游戏。下面让我们来看看这款…

初探工厂抽象模式

设计模式的-工厂模式 1.定义一个约定的规则抽象类 class ETFactory {createStore() {throw new Error(抽象方法&#xff0c;不允许直接调用&#xff0c;需重写)}createUser(){throw new Error(抽象方法&#xff0c;不允许直接调用&#xff0c;需重写)} } 案例&#xff1a;…

eNSP学习——OSPF在帧中继网络中的配置

目录 主要命令 原理概述 实验目的 实验场景 实验拓扑 实验编址 实验步骤 1、基本配置 2、在帧中继上搭建OSPF网络 主要命令 //检查帧中继的虚电路状态 display fr pvc-info//检查帧中继的映射表 display fr map-info//手工指定OSPF邻居,采用单播方式发送报文 [R1]os…

数据溢出导致的pthread_cond_timedwait工作异常

struct timespec ts; int rc; clock_gettime(CLOCK_MONOTONIC, &ts); ts.tv_nsec 300000000;//tv_nsec的最大值是999999999&#xff0c;这里直接加300毫秒&#xff0c;大概率会溢出&#xff0c;如果溢出应该把ts.tv_sec加1。 pthread_mutex_lock(&mutex_data_); …

Android Compose 文本输入框TextField使用详解

一、 TextField介绍 TextField 允许用户输入和修改文本&#xff0c;也就是文本输入框。 TextField 分为三种&#xff1a; TextField是默认样式OutlinedTextField 是轮廓样式版本BasicTextField 允许用户通过硬件或软件键盘修改文本&#xff0c;但不提供提示或占位符等装饰&a…

youlai-boot项目的学习—本地数据库安装与配置

数据库脚本 在项目代码的路径下&#xff0c;有两个版本的mysql数据库脚本&#xff0c;使用对应的脚本就安装对应的数据库版本&#xff0c;本文件选择了5 数据库安装 这里在iterm2下使用homebrew安装mysql5 brew install mysql5.7注&#xff1a;记得配置端终下的科学上网&a…

京准电钟 | NTP网络时间同步协议原理及其应用介绍

京准电钟 | NTP网络时间同步协议原理及其应用介绍 京准电钟 | NTP网络时间同步协议原理及其应用介绍 摘 要:首先对计算机网络时间同步相关技术进行了介绍,然后阐述了时间同步技术在现代计算机网络中的 应用与发展,最后指出时间同步网络在下一代网络(NGN) 中的重要地位。 随着…

Linux--(三)MQTT协议参数

一、QoS QoS 是 Quality of Service 的缩写&#xff0c;所以中文名便是服务质量。一个物联网通信中有些信息非常重要&#xff0c;我们需要确保这类重要信息可以准确无误的发送和接收&#xff0c;而有些信息则相对不那么重要&#xff0c;这类信息如果在传输中丢失不会影响系统…

实时工业数据采集分析系统高效处理产线信息!

对于大部分制造业企业&#xff0c;测量仪器的自动数据采集一直是个令人烦恼的事情&#xff0c;即使仪器已经具有RS232/485等接口&#xff0c;但仍然在使用一边测量&#xff0c;一边手工记录到纸张&#xff0c;再输入到PC中处理的方式&#xff0c;不但工作繁重&#xff0c;同时也…

try catch return语句情况分析

try catch return语句情况分析 try catch无finally语句写在最后 try catch try catch语法是一种对应于异常处理的语句&#xff0c;其中try语句内用于编写有异常存在可能的语句&#xff0c;而catch语句内用于编写捕获到异常的类型以及对异常对象的处理方法&#xff0c;本文主要…

鸿蒙: 基础认证

先贴鸿蒙认证 官网10个类别总结如下 https://developer.huawei.com/consumer/cn/training/dev-cert-detail/101666948302721398 10节课学习完考试 考试 90分合格 3次机会 1个小时 不能切屏 运行hello world hvigorfile.ts是工程级编译构建任务脚本 build-profile.json5是工程…

IPA清洁棉签 IPA清洁擦拭棒:打印机头、电子设备等清洁的有力工具!

在数字化快速发展的今天&#xff0c;打印机头、电子设备等已经成为了我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着使用时间的增长&#xff0c;这些设备往往会因为灰尘、油渍等污染物的积累而影响其性能。此时&#xff0c;一款高效、便捷的清洁工具就显得尤为重…

Antdv 备忘

www.antdv.com 1. <a-select 默认选中&#xff1a; <a-select :value"refreshInterval" 2.使用Drawer (单独页面方式) <template> <a click"changeTheme" style"padding-right: 20px">切换主题</a> <SettingD…

数据预处理之基于聚类的TOD异常值检测#matlab

1.基于聚类的异常值检测方法 物以类聚——相似的对象聚合在一起&#xff0c;基于聚类的异常点检测方法有两个共同特点&#xff1a; (1)先采用特殊的聚类算法处理输入数据而得到聚类&#xff0c;再在聚类的基础上来检测异常。 (2)只需要扫描数据集若干次&#xff0c;效率较高…

3D Gaussian Splatting Windows安装

1.下载源码 git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive 2.安装cuda NVIDIA GPU Computing Toolkit CUDA Toolkit Archive | NVIDIA Developer 3.安装COLMAP https://github.com/colmap/colmap/releases/tag/3.9.1 下载完成需要添加环…

基于Springboot框架班级综合测评管理系统的设计与实现

开头语&#xff1a;你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Springboot框架&#xff0c;B/S模式 工具&#xff1a;MyEclipse 系统展示 首页…

Go 并发控制:RWMutex 实战指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…