Java排序算法之<插入排序>

目錄

1、插入排序

2、流程介紹

3、java實現

4、性能介紹


前言

????????在 Java 中,?冒泡排序(Bubble Sort)?和?選擇排序(Selection Sort)?之后,下一個性能更好的排序算法通常是?插入排序(Insertion Sort)

????????雖然它們的時間復雜度都是?O(n2),但在實際應用中,插入排序通常比選擇排序和冒泡排序更快,尤其是在處理部分有序數據時表現更優。

總結:Java 排序算法進階路線

  1. O(n2) 算法(適合學習原理)

    • 冒泡排序(最慢)→ 選擇排序 →?插入排序(推薦先學)

  2. O(n log n) 算法(實際應用)

    • 歸并排序(穩定)→ 快速排序(最快,但不穩定)→ 堆排序(空間省)

  3. Java 內置排序

    • Arrays.sort():對基本類型用?快速排序,對象類型用?歸并排序(保證穩定性)。


1、插入排序

Insertion Sort:插入排序是一種簡單直觀的排序算法,適合小規模數據部分有序數據

1、核心思想

????????將數組分為?已排序?和?未排序?兩部分,逐個將未排序部分的元素插入到已排序部分的正確位置。

2、適合場景

小規模數據或基本有序的數據(如日志按時間插入)。

3、時間復雜度:

最壞情況下為O(N*N),此時待排序列為逆序,或者說接近逆序。
最好情況下為O(N),此時待排序列為升序,或者說接近升序。

4、空間復雜度:O(1)。


2、流程介紹

如下圖所示:

步驟:

1.從第一個元素開始,該元素可以認為已經被排序.
2.取下一個元素tem,從已排序的元素序列從后往前掃描.
3.如果該元素大于tem,則將該元素移到下一位.
4.重復步驟3,直到找到已排序元素中小于等于tem的元素.
5.tem插入到該元素的后面,如果已排序所有元素都大于tem,則將tem插入到下標為0的位置.
6.重復步驟2~5.


3、java實現

代碼示例如下:

public class InsertionSort {/*** 插入排序(升序)* @param arr 待排序數組*/public static void insertionSort(int[] arr) {if (arr == null || arr.length <= 1) {return; // 邊界條件:數組為空或長度≤1時無需排序}// 從第二個元素開始(下標1),默認第一個元素已排序for (int i = 1; i < arr.length; i++) {int current = arr[i]; // 當前待插入的元素int j = i - 1;       // 已排序部分的最后一個元素下標// 從后往前遍歷已排序部分,尋找插入位置while (j >= 0 && arr[j] > current) {arr[j + 1] = arr[j]; // 比 current 大的元素向后移動j--;}// 插入 current 到正確位置arr[j + 1] = current;}}public static void main(String[] args) {int[] arr = {12, 11, 13, 5, 6};System.out.println("排序前: " + Arrays.toString(arr));insertionSort(arr);System.out.println("排序后: " + Arrays.toString(arr));}
}

輸出:

排序前: [12, 11, 13, 5, 6]
排序后: [5, 6, 11, 12, 13]

關鍵步驟解析

  1. 外層循環

    • 從?i = 1?開始(默認?arr[0]?是已排序部分)。

    • 每次迭代處理一個未排序元素?current = arr[i]

  2. 內層循環

    • 從?j = i - 1?開始,反向遍歷已排序部分。

    • 如果?arr[j] > current,則將?arr[j]?向后移動一位。

    • 直到找到?arr[j] ≤ current?的位置,此時?j + 1?就是?current?的插入位置。

  3. 插入操作

    • 將?current?放入?arr[j + 1]


4、性能介紹

??為什么插入排序比選擇排序快?

  1. 比較次數更少:選擇排序每一輪都要遍歷剩余全部元素找最小值,而插入排序在數據基本有序時只需少量比較。

  2. 提前終止:如果數據已經有序,插入排序內層循環會立即終止(類似冒泡優化版)。

  3. 數據局部性:插入排序是順序訪問數組,對 CPU 緩存更友好。


總結

  1. 小數組排序

    • Java 的?Arrays.sort()?在子數組長度 ≤ 47 時,會切換到插入排序。

  2. 部分有序數據

    • 如日志按時間插入、游戲排行榜實時更新。

  3. 混合排序算法

    • 快速排序的遞歸基改用插入排序(如?QuickSort + InsertionSort)。


參考文章:

1、六大排序算法:插入排序、希爾排序、選擇排序、冒泡排序、堆排序、快速排序-CSDN博客https://blog.csdn.net/weixin_50886514/article/details/119045154?ops_request_misc=%257B%2522request%255Fid%2522%253A%25220faf03d22b2d125d5f49a4649ad59c85%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=0faf03d22b2d125d5f49a4649ad59c85&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-119045154-null-null.142^v102^control&utm_term=%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F&spm=1018.2226.3001.4187

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916430.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916430.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916430.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《計算機網絡》實驗報告七 HTTP協議分析與測量

目 錄 1、實驗目的 2、實驗環境 3、實驗內容 4、實驗結果與分析 4.1 使用tcpdump命令抓包 4.2 HTTP字段分析 5、實驗小結 5.1 問題與解決辦法&#xff1a; 5.2 心得體會&#xff1a; 1、實驗目的 1、了解HTTP協議及其報文結構 2、了解HTTP操作過程&#xff1a;TCP三次…

面試實戰,問題十三,Redis在Java項目中的作用及使用場景詳解,怎么回答

Redis在Java項目中的作用及使用場景詳解&#xff08;面試要點&#xff09; 一、Redis的核心作用高性能緩存層 原理&#xff1a;Redis基于內存操作&#xff08;引用[2]&#xff09;&#xff0c;采用單線程模型避免線程切換開銷&#xff0c;配合IO多路復用實現高吞吐&#xff08;…

Python - 100天從新手到大師 - Day6

引言 這里主要是依托于 jackfrued 倉庫 Python-100-Days 進行學習&#xff0c;記錄自己的學習過程和心得體會。 1 文件讀寫和異常處理 實際開發中常常會遇到對數據進行持久化的場景&#xff0c;所謂持久化是指將數據從無法長久保存數據的存儲介質&#xff08;通常是內存&…

IP--MGER綜合實驗報告

一、實驗目的完成網絡設備&#xff08;路由器 R1-R5、PC1-PC4&#xff09;的 IP 地址規劃與配置&#xff0c;確保接口通信基礎正常。配置鏈路層協議及認證&#xff1a;R1 與 R5 采用 PPP 的 PAP 認證&#xff08;R5 為主認證方&#xff09;&#xff0c;R2 與 R5 采用 PPP 的 CH…

window的WSL怎么一鍵重置

之前用WSL來在windows和服務器之間傳輸數據&#xff0c;所以有很多數據緩存&#xff0c;但是現在找不到他們的路徑&#xff0c;所以想直接重置 首先使用spacesniffer看一下C盤的情況&#xff1a;看起來&#xff0c;這個WSL真的占用了很多空間&#xff0c;但是我又不知道該怎么刪…

卷積神經網絡研討

卷積操作原理: 特征向量與遍歷:假設已知特征向量(如藍天白云、綠油油草地特征),在輸入圖像的各個區域進行遍歷,通過計算內積判斷該區域是否有想要的特征。 內積計算特征:內積為 0 表示兩個向量垂直,關系不好,無想要的特征;夾角越小,內積越大,代表區域中有想要的特征…

【EWARM】EWARM(IAR)的安裝過程以及GD32的IAR工程模板搭建

一、簡介 IAR官網 EWARM&#xff0c;即 IAR Embedded Workbench for ARM&#xff0c;是由 IAR Systems 開發的一款專門用于 ARM 微處理器軟件開發的集成開發環境。以下是具體介紹&#xff1a; 功能特性&#xff1a; 完整工具鏈支持&#xff1a;集成了高級編輯器、全面的編譯…

【工程化】淺談前端構建工具

一、前端構建工具概述? 前端構建工具是輔助開發者將源代碼轉換為瀏覽器可直接運行的靜態資源的工具集合。隨著前端技術的發展&#xff0c;源代碼往往包含瀏覽器無法直接解析的語法&#xff08;如 TypeScript、Sass&#xff09;、模塊化規范&#xff08;如 ES Modules、Common…

數據取證:Elcomsoft Password Digger,解密 macOS (OS X) 鑰匙串信息

Elcomsoft Password Digger&#xff08;EPD&#xff09;是一款在 Windows 平臺上使用的工具&#xff0c;用于解密存儲在 macOS 鑰匙串中的信息。該工具可以將加密的鑰匙串內容導出到一個純文本 XML 文件中&#xff0c;方便查看和分析。一鍵字典構建功能可以將鑰匙串中的所有密碼…

2.JVM跨平臺原理(字節碼機制)

目錄引言一、跨平臺就跟國際語言翻譯似的二、字節碼和 JVM 到底是啥玩意兒三、解決 “語言不通” 這個老難題四、實現 “一次編寫&#xff0c;到處運行” 就這四步五、字節碼技術給世界帶來的大改變總結引言 咱平常是不是老納悶兒&#xff0c;為啥同一個 Java 程序&#xff0c…

06-ES6

微任務&宏任務JS是單線程執行。所有要執行的任務都要排隊。所有的同步任務會在主線程上排隊&#xff0c;等待執行。異步任務&#xff1a;不會進入主線程&#xff0c;而是會進入任務隊列。等到主線程上的任務執行完成之后&#xff0c;通知任務隊列&#xff0c;執行異步任務。…

FreeSWITCH配置文件解析(10) 配置IP封禁(防暴力破解)

以下是針對FreeSWITCH配置IP封禁&#xff08;防暴力破解&#xff09;的完整方案&#xff0c;結合Fail2Ban與系統級防護策略&#xff1a;一、Fail2Ban核心配置&#xff08;推薦方案&#xff09;??啟用FreeSWITCH鑒權日志??修改SIP Profile&#xff08;conf/sip_profiles/int…

【React 入門系列】React 組件通訊與生命周期詳解

&#x1f9e9; 第一章&#xff1a;組件通訊概述在 React 開發中&#xff0c;組件是封裝的、獨立的功能單元。為了實現組件間的數據共享與協作&#xff0c;需要通過組件通訊機制。組件通訊的意義&#xff1a; 讓多個封閉的組件能夠共享數據&#xff0c;實現協作功能。&#x1f4…

前端開發 Vue 狀態優化

Vue 項目中的狀態優化一般都會用Pinia替代Vuex&#xff0c;Pinia 是 Vue 生態系統中的一個輕量級狀態管理庫&#xff0c;作為 Vuex 的替代品&#xff0c;它提供了更簡潔的 API 和更好的性能。模塊化管理&#xff1a;使用 Pinia 時&#xff0c;建議將狀態拆分為多個 store 模塊&…

虛幻基礎:創建角色——FPS

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄創建角色設置模型添加攝像機添加位置&#xff1a;插槽彈簧臂&#xff1a;伸縮防止由碰撞導致攝像機穿模攝像機添加武器添加位置&#xff1a;插槽創建動畫藍圖&#xff1a;主動獲取角色數據并播放相應動畫設置角色控制…

2025年入局蘋果Vision Pro開發:從零到發布的完整路線圖

蘋果Vision Pro的發布標志著空間計算(Spatial Computing)進入主流市場。作為開發者,如何快速掌握visionOS開發?本文將為你提供詳細的路線圖、實踐建議與資源指南,涵蓋從窗口式應用到沉浸式3D應用的完整開發路徑。 一、visionOS開發的核心目標與階段劃分 visionOS的開發可…

百度文心大模型ERNIE全面解析

百度文心大模型ERNIE概述 百度推出的文心大模型(ERNIE,Enhanced Representation through kNowledge IntEgration)系列是結合知識增強技術的預訓練大模型,涵蓋自然語言處理(NLP)、跨模態、行業應用等多個方向。其開源版本為開發者提供了可商用的大模型能力支持。 ERNIE的…

【SpringAI實戰】提示詞工程實現哄哄模擬器

一、前言 二、實現效果 三、代碼實現 3.1 后端實現 3.2 前端實現 一、前言 Spring AI詳解&#xff1a;【Spring AI詳解】開啟Java生態的智能應用開發新時代(附不同功能的Spring AI實戰項目)-CSDN博客 二、實現效果 游戲規則很簡單&#xff0c;就是說你的女友生氣了&#x…

速通python加密之AES加密

AES加密 AES加密&#xff08;Advanced Encryption Standard&#xff0c;高級加密標準&#xff09;是目前全球公認的最安全、應用最廣泛的對稱加密算法之一&#xff0c;于2001年被美國國家標準與技術研究院&#xff08;NIST&#xff09;確定為替代DES的標準加密算法&#xff0c;…

Java 對象秒變 Map:字段自由伸縮的優雅實現

前言 在開發中,我們常常需要把對象轉成 Map 格式,用于序列化、傳輸、展示,甚至硬塞給某些第三方框架吃進去再吐出來。乍一看很簡單,字段多起來后就像打翻調色盤,維護起來一不小心就翻車。想優雅地搞定這事,必須有一套穩妥、可擴展的方案,才能寫出讓同事膜拜、領導點贊、…