【數據結構與算法】十大經典排序算法-插入排序

🌟個人博客:www.hellocode.top
🏰Java知識導航:Java-Navigate
🔥CSDN:HelloCode.
🌞知乎:HelloCode
🌴掘金:HelloCode
?如有問題,歡迎指正,一起學習~~


插入排序(Insertion Sort)是一種簡單直觀的排序算法,其基本思想是將一個記錄插入到已排好序的有序序列中,直到所有記錄插入完成為止。

基本思想

在這里插入圖片描述

如上圖所示,插入排序的基本思想就是將一個數組劃分為兩部分:有序部分和無序部分。通過將無序部分的元素依次插入有序部分(需要找到對應的正確位置),讓每次插入的每個元素都能在正確的位置,保證有序部分始終有序,在將無序部分的元素全部插入到有序部分后,整個集合也就為有序的了。

  1. 從第二個元素開始,依次將當前元素插入到已排好序的有序序列中,直到最后一個元素。
  2. 插入當前元素時,從后往前遍歷已排好序的有序序列,找到當前元素在有序序列中的位置,并將其插入到該位置。
  3. 重復執行步驟2,直到所有元素都插入完畢。

舉個例子,比如我們有一組數字 [5, 3, 8, 4, 2],我們可以首先把第一個數字5視為已排序序列,然后從第二個數字3開始,與已排序序列中的元素逐一比較,找到合適的位置插入。然后針對第三個數字8,我們再重復這個過程,直至所有的數字都插入到已排序序列中。

代碼實現

具體的代碼就是兩層for循環,外層控制未排序部分的指針,內層不斷循環尋找新插入元素的正確位置,代碼如下:

/*** @author HelloCode* @blog https://www.hellocode.top* @date 2023年08月09日 21:45*/
public class InsertSort {public static void main(String[] args) {int[] arr = {21, 64, 32, 11, 9, 5, 3, 41, 75, 32, 12, 98, 66};System.out.println("排序前:" + Arrays.toString(arr));insertSort(arr);System.out.println("排序后:" + Arrays.toString(arr));}public static void insertSort(int[] arr) {// 外層循環,i指向數組中未排序的元素,也可以表示已經有序元素的個數for (int i = 1; i < arr.length; i++) {// 內層for指向已經排好序的最后一個元素for (int j = i - 1; j >= 0; j--) {// 開始排序,尋找新加入的元素的正確位置,(j + 1)代表新加入的元素if (arr[j + 1] >= arr[j]) {// 代表不用交換,加入即有序,直接跳出循環break;}// 否則需要進行交換,直到找到合適位置int temp = arr[j + 1];arr[j + 1] = arr[j];arr[j] = temp;}}}
}

測試:

image-20230809221142902

優化

對于插入排序,能夠優化的點我認為是在為新插入元素尋找正確位置的時候,上面的代碼采用的是依次比較,類似于冒泡排序的思想。如果數據量大且情況最差的時候,效率就有些不理想了,因此可以用其他方法在此處進行優化,提升插入排序的性能

二分查找:在每次需要插入元素時,使用二分查找來找到插入的位置,而不是從頭到尾掃描已排序序列。這樣可以將比較次數降低為O(log n)。

具體代碼這里就不列了,后面可能會有專門的二分查找文章。

總結

優點

  1. 實現簡單,對于部分有序的數組效率高。
  2. 對于小規模數據或者部分有序的數據,插入排序的運行時間相對較短。

缺點

  1. 對于大規模數據或者隨機數據,插入排序的時間復雜度較高,為O(n^2)。
  2. 是非穩定的排序算法,即相等的元素可能會因為排序而變得順序顛倒。

復雜度

  • 時間復雜度:O(n^2)
  • 空間復雜度:O(1)

使用場景

  1. 小型數據集:對于小型的數據集,插入排序是一種高效且簡單的排序算法
  2. 部分排序的數據集:如果一個數據集大部分是排序的,那么插入排序將是一個很好的選擇。例如,考慮一個場景,一個團隊在一場比賽中獲得了一組分數,這些分數按照高低已經被排序,但是有一個新的分數需要插入到合適的位置。在這種情況下,插入排序可以快速找到新分數的位置并把它插入到正確的位置。
  3. 外部排序:當處理非常大的數據集時,可能需要使用外部排序。外部排序是指那些不能一次性加載到內存中的數據的排序。在這種情況下,可以使用插入排序作為子程序,從外部存儲器中讀取元素并將它們插入到已經排序的部分中。
  4. 與其他算法結合:插入排序也可以與其他算法結合使用。例如,當需要先對數據進行排序,然后再進行一些復雜的操作時,可以使用插入排序作為預處理步驟。

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

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

相關文章

云原生應用場景及交付部署

云原生是一種軟件架構和開發方式&#xff0c;旨在支持在云環境中構建、部署和管理應用程序。它是為了克服傳統應用程序在云環境中所面臨的挑戰而提出的一種方法。云原生應用場景廣泛&#xff0c;以下是一些常見的云原生應用場景&#xff0c;并提供了一些詳細解釋&#xff1a; …

第57步 深度學習圖像識別:CNN可視化(Pytorch)

基于WIN10的64位系統演示 一、寫在前面 由于不少模型使用的是Pytorch&#xff0c;因此這一期補上基于Pytorch實現CNN可視化的教程和代碼&#xff0c;以SqueezeNet模型為例。 二、CNN可視化實戰 繼續使用胸片的數據集&#xff1a;肺結核病人和健康人的胸片的識別。其中&…

問DAO成都丨CyberDAO共識會議在成都圓滿落幕

過往匆匆&#xff0c;唯有共識綿延&#xff1b;未來已來&#xff0c;愿與智者同謀。2023年8月9日至8月10日&#xff0c;CyberDAO共識會議在成都市大邑縣順利召開&#xff0c;吸引了上百名Web3.0與元宇宙愛好者參與本次會議。CyberDAO大中華區運營團隊合伙人JR、漫威、安祈、可樂…

【0.1】lubancat魯班貓4刷入debian網絡ping 域名不通問題

目錄 1. 環境2. 操作步驟 1. 環境 lubancat4魯班貓4 (4G0)不帶emmc系統鏡像lubancat-rk3588-debian11-gnome-20230807_update.img官方資料地址https://doc.embedfire.com/products/link/zh/latest/linux/ebf_lubancat.html 2. 操作步驟 從官網給的百度網盤下載linux系統全部…

10、雜項:遍歷指定目錄計算文件的md5并輸出到文件

目錄 &#x1f345;點擊這里查看所有博文 隨著自己工作的進行&#xff0c;接觸到的技術棧也越來越多。給我一個很直觀的感受就是&#xff0c;某一項技術/經驗在剛開始接觸的時候都記得很清楚。往往過了幾個月都會忘記的差不多了&#xff0c;只有經常會用到的東西才有可能真正記…

【Rust】Rust學習 第十一章編寫自動化測試

Rust 是一個相當注重正確性的編程語言&#xff0c;不過正確性是一個難以證明的復雜主題。Rust 的類型系統在此問題上下了很大的功夫&#xff0c;不過它不可能捕獲所有種類的錯誤。為此&#xff0c;Rust 也在語言本身包含了編寫軟件測試的支持。 編寫一個叫做 add_two 的將傳遞…

[C++ 網絡協議編程] TCP/IP協議

目錄 1. TCP/IP協議棧 2. TCP原理 2.1 TCP套接字中的I/O緩沖 2.2 TCP工作原理 2.2.1 三次握手&#xff08;連接&#xff09; 2.2.2 與對方主機的數據交換 2.2.3 四次握手&#xff08;斷開與套接字的連接&#xff09; TCP&#xff08;Transmission Control Protocol傳輸控…

無涯教程-Perl - ref函數

描述 如果EXPR為引用,則此函數返回真值&#xff1b;如果未提供EXPR,則為$_。返回的實際值還定義了引用所引用的實體的類型。 內置類型為- REFSCALARARRAYHASHCODEGLOBLVALUEIO::Handle 如果使用bless()函數為變量設置了祝福,則將返回新的數據類型。新的數據類型通常將是一個…

比較編程語言C和Go

使用一個簡單的計數程序來比較古老的C語言和現代的Go語言。Go是一種現代的編程語言&#xff0c;它在很大程度上源自C語言。因此&#xff0c;對于任何使用C語言編寫程序的人來說&#xff0c;Go可能會感覺很熟悉。Go使得編寫新程序變得容易&#xff0c;同時又讓C程序員感到熟悉&a…

大數據-玩轉數據-Flink 自定義Sink(Mysql)

一、說明 如果Flink沒有提供給我們可以直接使用的連接器&#xff0c;那我們如果想將數據存儲到我們自己的存儲設備中&#xff0c;mysql 的安裝使用請參考 mysql-玩轉數據-centos7下mysql的安裝 創建表 CREATE TABLE sensor (id int(10) ) ENGINEInnoDB DEFAULT CHARSETutf8二…

二 根據用戶行為數據創建ALS模型并召回商品

二 根據用戶行為數據創建ALS模型并召回商品 2.0 用戶行為數據拆分 方便練習可以對數據做拆分處理 pandas的數據分批讀取 chunk 厚厚的一塊 相當大的數量或部分 import pandas as pd reader pd.read_csv(behavior_log.csv,chunksize100,iteratorTrue) count 0; for chunk in …

DNS協議及其工作原理

DNS是域名系統&#xff08;Domain Name System&#xff09;的縮寫&#xff0c;它是一種用于將域名轉換為IP地址的分布式數據庫系統。它是因特網的基石&#xff0c;能夠使人們通過域名方便地訪問互聯網&#xff0c;而無需記住復雜的IP地址。 DNS的歷史可以追溯到1983年&#xf…

4個簡化IT服務臺任務的ChatGPT功能

最近幾個月&#xff0c;ChatGPT 風靡全球&#xff0c;這是一個 AI 聊天機器人&#xff0c;使用戶能夠生成腳本、文章、鍛煉圖表等。這項技術在各行各業都有無窮無盡的應用&#xff0c;在本文中&#xff0c;我們將研究這種現代技術如何幫助服務臺團隊增強服務交付和客戶體驗。 什…

最佳實踐:如何優雅地提交一個 Amazon EMR Serverless 作業?

《大數據平臺架構與原型實現&#xff1a;數據中臺建設實戰》一書由博主歷時三年精心創作&#xff0c;現已通過知名IT圖書品牌電子工業出版社博文視點出版發行&#xff0c;點擊《重磅推薦&#xff1a;建大數據平臺太難了&#xff01;給我發個工程原型吧&#xff01;》了解圖書詳…

章節7:XSS檢測和利用

章節7&#xff1a;XSS檢測和利用 測試payload <script>alert(XSS)</script> <script>alert(document.cookie)</script> ><script>alert(document.cookie)</script> ><script>alert(document.cookie)</script> &qu…

元宇宙之經濟(02)理解NFT

1 NFT是什么&#xff1f; 想象一下&#xff0c;你小時候曾經在操場上集齊過各種不同的貼紙&#xff0c;然后和朋友們交換&#xff0c;這些貼紙有著獨特的圖案和價值。NFT的概念與此類似&#xff0c;但在數字世界中運作。NFT是一種基于區塊鏈技術的數字資產&#xff0c;每個NFT…

golang—面試題大全

目錄標題 sliceslice和array的區別slice擴容機制slice是否線程安全slice分配到棧上還是堆上擴容過程中是否重新寫入go深拷貝發生在什么情況下&#xff1f;切片的深拷貝是怎么做的copy和左值進行初始化區別slice和map的區別 mapmap介紹map的key的類型map對象如何比較map的底層原…

《Java極簡設計模式》第03章:工廠方法模式(FactoryMethod)

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章匯總&#xff1a;https://binghe.gitcode.host/md/all/all.html 源碼地址&#xff1a;https://github.com/binghe001/java-simple-design-patterns/tree/master/j…

無法正確識別車牌(Python、OpenCv、Tesseract)

我正在嘗試識別車牌&#xff0c;但出現了錯誤&#xff0c;例如錯誤/未讀取字符 以下是每個步驟的可視化&#xff1a; 從顏色閾值變形關閉獲得遮罩 以綠色突出顯示的車牌輪廓過濾器 將板輪廓粘貼到空白遮罩上 Tesseract OCR的預期結果 BP 1309 GD 但我得到的結果是 BP 1309…

騰訊云標準型CVM云服務器詳細介紹

騰訊云CVM服務器標準型實例的各項性能參數平衡&#xff0c;標準型云服務器適用于大多數常規業務&#xff0c;例如&#xff1a;web網站及中間件等&#xff0c;常見的標準型云服務器有CVM標準型S5、S6、SA3、SR1、S5se等規格&#xff0c;騰訊云服務器網來詳細說下云服務器CVM標準…