插入排序:一種簡單而直觀的排序算法

大家好!今天我們來聊聊一個簡單卻非常經典的排序算法——插入排序(Insertion Sort)。在所有的排序算法中,插入排序是最直觀的一個。

一、插入排序的基本思想

插入排序的核心思想是:將一個待排序的元素,插入到已排好序的部分中,使得插入后的部分依然是有序的。

具體來說,插入排序會從數組的第二個元素開始,逐步與前面的元素進行比較,并將其插入到合適的位置,直到整個數組都排序完成。

舉個例子:

  1. 假設我們有一個數組 [5, 3, 8, 4, 2],我們從第二個元素開始,逐個與前面的元素進行比較。
  2. 第一次比較,我們將 35 比較,發現 3 小于 5,就將 3 插入到 5 的前面,數組變成 [3, 5, 8, 4, 2]
  3. 第二次比較,將 8 與前面的元素逐一比較,發現它已經大于 5,不需要移動。
  4. 繼續這個過程,直到整個數組都變得有序。

二、插入排序的步驟

  1. 從第二個元素開始遍歷,逐個元素插入到已排好序的部分。
  2. 對于每個元素,向前比較,直到找到合適的位置為止。
  3. 插入的操作可以通過移動元素的位置來完成,使得原來位置較大的元素騰出位置來插入新的元素。

三、插入排序的實現

我們通過 Java 來實現插入排序,看看這個過程是如何完成的。

public static void InsertSort(int[] arr) {//i待插入數據下標for (int i = 1; i < arr.length; i++) {//j為已排序部分最后一個元素,即待排序元素的前一個元素,使j與j+1比較,j大交換,j小結束for (int j = i - 1; j >= 0; j--) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;} else{break;}}}}

四、插入排序的時間復雜度

插入排序的時間復雜度主要取決于待排序數據的順序。

  • 最優情況:當數組已經是有序的時,內層循環不會執行任何移動操作,因此時間復雜度是 O(n),其中 n 是數組的長度。

  • 最壞情況:當數組是逆序時,每次插入都需要將元素移動到數組的前面,這時內層循環會執行 i 次移動操作。因此時間復雜度是 O(n2)

  • 平均情況:假設元素是隨機排列的,平均情況下,時間復雜度也為 O(n2)

五、插入排序的優缺點

優點:
  1. 簡單直觀:插入排序的實現非常簡單,而且非常適合小規模數據的排序。
  2. 穩定性:插入排序是穩定的排序算法,即相等的元素不會交換位置。
  3. 適用于部分有序的數組:當數組已經接近有序時,插入排序會表現得非常高效。
缺點:
  1. 時間復雜度高:在數據規模較大的時候,插入排序的效率較低,特別是在最壞情況下,時間復雜度達到 O(n2)
  2. 不適合大規模數據:對于大數據量的排序,插入排序不是最優選擇。其他更高效的排序算法(如快速排序、歸并排序)通常會更適用。

六、插入排序的應用場景

盡管插入排序在大規模數據中效率較低,但在一些特殊場景下,它依然非常有用:

  1. 小規模數據排序:在數據量較小的情況下,插入排序非常高效且簡單。
  2. 部分有序的數組:如果數據已經部分有序,插入排序可以大大減少排序的工作量。
  3. 在線算法:插入排序是一種在線算法,也就是說它可以逐步地接收新的數據并進行排序。例如在實時排序數據流時,可以使用插入排序。

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

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

相關文章

2025年校園網絡招聘會匯總

1、衛生健康行業2025屆畢業生春季校園網絡招聘會 企業數量職位數量崗位數量10020002000 訪問地址&#xff1a; https://www.weirenjob.com/zph/zph_wsjkxy2025jbyscjxywlzph/ 2、山東地區面向2025屆高校畢業生網絡招聘活動 企業數量職位數量崗位數量909271052434 訪問地址&a…

Windows 10 GPU STACK 0.5.1 安裝

Windows 10 GPU STACK 0.5.1 安裝 1 GPUStack 安裝1.Python安裝&#xff08;3.10/11/12&#xff09;2.GPUStack 下載3.生成密碼4.訪問5.設置模型下載目錄6.禁用開機自啟并重啟服務7.安裝模型8.查看安裝的進度 2.試驗場聊天測試1.對話模式 3.API Key 測試 1 GPUStack 安裝 1.Py…

【數據結構】快指針和慢指針

一、 給你單鏈表的頭結點 head ,請你找出并返回鏈表的中間結點。如果有兩個中間結點,則返回第二個中間結點。 要求&#xff1a;只遍歷一遍鏈表 可以使用快慢指針&#xff1a;fast 一次走兩步&#xff0c;slow 一次走一步。當 fast NULL&#xff08;偶數個結點&#xff09;或…

1.3 嵌入式系統的固件

嵌入式系統的固件&#xff0c;一般情況下的作用是: 1.硬件抽象層&#xff08;HAL&#xff09;&#xff1a;固件提供了一個硬件抽象層&#xff0c;它將硬件的復雜性隱藏起來&#xff0c;為上層軟件提供了一套標準的接口。這樣&#xff0c;操作系統和應用程序不需要直接與硬件打交…

中國工業互聯網研究院:人工智能大模型年度發展趨勢報告

當前&#xff0c;以大模型為代表的人工智能正快速演進&#xff0c;激發全球科技之變、產業之變、時代之變&#xff0c;人工智能發展迎來新高潮。隨著大模型推理、多模態生成、智能體等創新技術的發展&#xff0c;大模型賦能千行百業將進一步提速。中國工業互聯網研究院全方位剖…

【cv】vs2022配置opencv

release下配置包含目錄和庫目錄 E:\sdk\sdk_cuda12.3\opencv490\include E:\sdk\sdk_cuda12.3\opencv490\include\opencv2 E:\sdk\sdk_cuda12.3\opencv490\lib release下配置包含鏈接器輸入的依附依賴項 opencv_world490.lib release編譯文件夾下需手動復制opencv_world49…

Python Pandas庫使用指南:從入門到精通

1. 引言 Pandas 是 Python 中用于數據處理和分析的核心庫之一。它提供了高效的數據結構(如 DataFrame 和 Series),能夠輕松處理結構化數據,支持數據清洗、過濾、聚合、合并等操作。Pandas 在數據分析、機器學習和科學計算領域中被廣泛使用。 本文將詳細介紹 Pandas 的基本…

Visual Studio中打開多個項目

1) 找到解決方案窗口 2) 右鍵添加→ 選擇現有項目 3) 選擇.vcxproj文件打開即可

react路由總結

目錄 一、腳手架基礎語法(16~17) 1.1、hello react 1.2、組件樣式隔離(樣式模塊化) 1.3、react插件 二、React Router v5 2.1、react-router-dom相關API 2.1.1、內置組件 2.1.1.1、BrowserRouter 2.1.1.2、HashRouter 2.1.1.3、Route 2.1.1.4、Redirect 2.1.1.5、L…

內外網隔離文件傳輸解決方案|系統與釘釘集成+等保合規,安全提升70%

一、背景與痛點 在內外網隔離的企業網絡環境中&#xff0c;員工與外部協作伙伴&#xff08;如釘釘用戶&#xff09;的文件傳輸面臨以下挑戰&#xff1a; 1. **安全性風險**&#xff1a;內外網直連可能導致病毒傳播、數據泄露。 2. **操作繁瑣**&#xff1a;傳統方式需頻繁切…

多線程篇學習面試

多線程 1.樂觀鎖、CAS思想 java樂觀鎖機制&#xff1a; ? 樂觀鎖體現的是悲觀鎖的反面。它是一種積極的思想&#xff0c;它總是認為數據是不會被修改的&#xff0c;所以是不會對數據上鎖的。但是樂觀鎖在更新的時候會去判斷數據是否被更新過。樂觀鎖的實現方案一般有兩種&a…

云服務器和物理服務器該如何選擇

隨著互聯網的快速發展&#xff0c;企業大多都會選擇云服務器和物理服務器進行使用&#xff0c;那么對于云服務器和物理服務器兩者之間該如何進行選擇呢&#xff1f; 云服務器可以為用戶和企業提供網站處理中等到高流量所需要的一切&#xff0c;云服務器中的高可用能性功能&…

將產品照片(form.productPhotos)轉為 JSON 字符串發送給后端

文章目錄 1. 前端 form.productPhotos 的當前處理a. 組件綁定b. 當前發送邏輯 2. 如何將 form.productPhotos 轉為 JSON 字符串發送給后端a. 修改前端 save() 方法b. 確保 esave API 支持接收字符串 基于你提供的 identify-form.vue 代碼&#xff0c;我將分析如何將產品照片&a…

SpringCloud系列教程:微服務的未來(二十五)-基于注解的聲明隊列交換機、消息轉換器、業務改造

前言 在現代分布式系統中&#xff0c;消息隊列是實現服務解耦和異步處理的關鍵組件。Spring框架提供了強大的支持&#xff0c;使得與消息隊列&#xff08;如RabbitMQ、Kafka等&#xff09;的集成變得更加便捷和靈活。本文將深入探討如何利用Spring的注解驅動方式來配置和管理隊…

國產編輯器EverEdit - 文本編輯器的關鍵特性:文件變更實時監視,多頭編輯不掉坑

1 監視文件變更 1.1 應用場景 某些時候&#xff0c;用戶會使用多個編輯器打開同一個文件&#xff0c;如果在A編輯器修改保存&#xff0c;但是B編輯器沒有重新打開&#xff0c;直接在B編輯器修改再保存&#xff0c;則可能造成在A編輯器中修改的內容丟失&#xff0c;因此&#x…

HAProxy介紹與編譯安裝

目錄 1、HAProxy介紹 2、HAProxy編譯安裝 Centos 基礎環境 Ubuntu 基礎環境 編譯安裝HAProxy 驗證HAProxy版本 HAProxy啟動腳本 配置文件 啟動haproxy 驗證haproxy狀態 查看haproxy的狀態頁面 1、HAProxy介紹 HAProxy是法國開發者 威利塔羅(Willy Tarreau) 在2000年…

python類型轉換深淺拷貝

1.類型轉換 1.1 int(x):轉化為一個整數&#xff0c;只能轉換由純數字組成的字符串 float->int 浮點型強轉整形會去掉小數點后面的數&#xff0c;只保留整數部分 a 1.2 print(type(a)) #<class float> b int(a) print(type(b)) #<class int>print(int…

分布式光纖聲波振動技術在鉆井泄漏檢測中的應用

在石油天然氣的鉆井作業中&#xff0c;及時發現并定位泄漏點對于保障開采安全、降低環境污染以及避免經濟損失至關重要。傳統的泄漏檢測方法往往存在局限性&#xff0c;而分布式光纖聲波振動技術憑借其獨特的優勢&#xff0c;正逐漸成為鉆井過程中尋找泄漏的有力工具。 技術原理…

rtconfig.cpython-313.pyc 在 .gitignore文件中寫入 *.pyc 文件仍然沒有被忽略?

在 .gitignore 文件中添加 *.pyc 和 *.*.pyc 規則時&#xff0c;如果 .pyc 文件仍然沒有被忽略&#xff0c;可能有以下幾種原因&#xff1a; 1. 已經被 Git 跟蹤的文件 即使您在 .gitignore 中指定了忽略 .pyc 文件&#xff0c;Git 仍然會跟蹤已經被提交到版本庫中的文件。如…

機器學習---KNN算法核心原理和思路分析

文章目錄 1.算法介紹2.過擬合和欠擬合3.幾種不同的距離4.特征的歸一化處理 特此聲明&#xff1a;該內容是學習耿直哥的相關機器學習理論&#xff0c;也是文章里面的部分圖片素材的來源 1.算法介紹 KNN全稱叫做K Nearset Neighbor,翻譯之后就是K個最近的鄰居&#xff1b; 其實…