排序第三篇 直接插入排序

插入排序的基本思想是: 每次將一個待排序的記錄按其關鍵字的大小插入到前面已排好序的文件中的適當位置, 直到全部記錄插入完為止

一 簡介

插入排序可分為2類
在這里插入圖片描述
本文介紹 直接插入排序
它的基本操作是: 假設待排充序的記錄存儲在數組 R[1…n] 中, 在排序過程的某一時刻, R被劃分成兩個子區間, R[1…i-1]R[i…n], 其中前一個為已排序的有序區, 后一個為無序區, 開始時有序區中只含有一個元素 R[1], 無序區為 R[2…n] .

排序過程中,只需要每次從無序區中取出第一個元素, 把它插入到有序區的適當位置, 使之成為新的有序區, 依次這樣經過 n ? 1 n-1 n?1 次插入后, 無序區為空, 有序區中包含了全部 n n n 個元素, 至此排序完畢。

以java為例, 看一個demo.


import java.util.Arrays;/*** 2024.2.19* 插入排序*/
public class InsertSort {public static void main(String[] args) {Integer[] array_ = new Integer[]{30,45,10,30,50};System.out.println("初始順序\n"+ Arrays.toString(array_));insertSort(array_);System.out.println("最后順序\n"+Arrays.toString(array_));}static void insertSort(Integer[] array){for(int i=1; i<array.length; i++){    //第0位 獨自作為有序數列, 從1開始, 說明第二部分從第二個元素操作if(array[i]<array[i-1]){       // 0~ i-1位為有序,  如果當前值 小于 前面一個值int temp = array[i];       //將當前值 賦值給 臨時變量int j = i-1;//從第i-1位向前遍歷并移位, 直到找到小于第 i 位值停止for(; j>=0 && temp < array[j]; j--) {   //j-- 說明是從后面往回走, 然后找插入位置array[j+1] = array[j];      // 將記錄后移一位}array[j+1] = temp;      // 將基準插入到正確位置}}}
}

程序運行結果:
在這里插入圖片描述

直接插入排序

二 原理

直接插入排序算法 有兩重循環, 外循環表示要進行 n ? 1 n-1 n?1趟排序, 內循環表明完成一趟排序所進行的記錄間的比較和記錄的后移。 在每一趟排序中, 最多可能進行 i 次比較, 移動 i + 1 i + 1 i+1 個記錄(后循環前后作兩次移動)

所以在最壞的情況下(反序) , 插入排序的關鍵字之間比較次數和記錄移動次數達最大值。

最大比較次數: C m a x = ∑ i = 2 n = ( n + 2 ) ( n ? 1 ) 2 C_{max} = \sum_{ i=2}^{n }=\frac{(n+2)(n-1)}{2} Cmax?=i=2n?=2(n+2)(n?1)?

最大移動次數: M m a x = ∑ i = 2 n ( i ? 1 ) = ( n + 4 ) ( n ? 1 ) 2 M_{max} = \sum_{ i=2}^{n}{(i-1)}=\frac{(n+4)(n-1)}{2} Mmax?=i=2n?(i?1)=2(n+4)(n?1)?

三 時間復雜度和空間復雜度

由上述分析可知, 當原始數組的初始狀態不同時, 直接插入排序算法的時間復雜度有很大差別, 最好的情況是數組初始為正序即升序, 此時的時間復雜度為 O ( n ) O(n) O(n).

最壞的情況是數組初始狀態為反序, 此時的時間復雜度為 O ( n 2 ) O(n^{2}) O(n2) .

容易證明該算法的平均時間復雜度也為 O ( n 2 ) O(n^{2}) O(n2). 這時因為對當前無序區 R [ 2.. i ? 1 ] ( 2 ? i ? n ) R[2..i-1] (2 \leqslant i\leqslant n) R[2..i?1](2?i?n), 平均比較次數為 ( i ? 1 ) / 2 (i-1) / 2 (i?1)/2,所以總的比較和移動次數約為 n ( n ? 1 ) / 4 ≈ n 2 4 n(n-1) /4 \approx \frac{n^2}{4} n(n?1)/44n2?.

該算法的空間復雜度 S ( n ) 為 O ( 1 ) S(n) 為 O(1) S(n)O(1)

注意概念: 若排序算法所需要的額外空間相對于輸入數據量來說是一個常數, 則稱該排序為就地排序。
直接插入排序是一個就地排序。

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

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

相關文章

電路設計(27)——交通信號燈的multisim仿真

1.功能要求 使用數字芯片設計一款交通信號燈&#xff0c;使得&#xff1a; 主干道的綠燈時間為60S&#xff0c;紅燈時間為45S 次干道的紅燈時間為60S&#xff0c;綠燈時間為45S 主、次干道&#xff0c;綠燈的最后5S內&#xff0c;黃燈閃爍 使用數碼管顯示各自的倒計時時間。 按…

JavaScript 數組、遍歷

數組 多維數組&#xff1a;數組里面嵌套 一層數組為二維數組。一維數組的使用頻率是最高的。 如果數組訪問越界會返回undefined。 數組遍歷 數組方法Array.isArray() 這個方法可以去判定一個內容是否是數組。

AndroidStudio 2024-2-21 Win10/11最新安裝配置(Kotlin快速構建配置,gradle鏡像源)

AndroidStudio 2024 Win10/11最新安裝配置 教程目的&#xff1a; (從安裝到卸載) &#xff0c;針對Kotlin開發配置&#xff0c;gradle-8.2-src/bin下載慢&#xff0c;以及Kotlin構建慢的解決 好久沒玩AS了,下載發現裝個AS很麻煩,就覺得有必要出個教程了(就是記錄一下:嘻嘻) 因…

把一個對象變成可迭代對象的兩種方法,使用Symbol.iterator 和生成器Generator

方法一&#xff1a;自定義Symbol.iterator屬性 如果對象擁有[Symbol.iterator] 方法&#xff0c;改方法返回一個迭代器對象&#xff0c;就可以稱之為可迭代對象&#xff0c;注意迭代器是一個有 next 方法的對象 步驟如下 實現一個Symbol.iterator 鍵值是一個函數&#xff0c;…

java 時間格式 YYYY 于yyyy的區別

java formatDate 時間時&#xff0c;經常需要輸入格式比如 YYYYMMDD,yyyyMMdd 這兩個是有區別的 具體每個參數可以看下面

igolang學習1,dea的golang-1.22.0

參考&#xff1a;使用IDEA配置GO的開發環境備忘錄-CSDN博客 1.下載All releases - The Go Programming Language (google.cn) 2.直接next 3.window環境變量配置 4.idea的go插件安裝 5.新建go項目找不到jdk解決 https://blog.csdn.net/ouyang111222/article/details/1361657…

代碼隨想錄算法訓練營第40天| 343. 整數拆分、96.不同的二叉搜索樹

343. 整數拆分 完成 思路&#xff1a; dp數組存放正整數i拆分后的乘積最大值&#xff1b;i可以拆分為j和i-j&#xff0c;也可以是j和dp[i-j]。 代碼 class Solution {public int integerBreak(int n) {int[] dp new int[n1];dp[2] 1;// 推導i的拆分乘積最大值for (int i …

【js】無限虛擬列表的原理及實現

什么是虛擬列表 虛擬列表是長列表按需顯示思路的一種實現&#xff0c;即虛擬列表是一種根據滾動容器元素的可視區域來渲染長列表數據中某一個部分數據的技術。 簡而言之&#xff0c;虛擬列表指的就是「可視區域渲染」的列表。有三個概念需要了解一下&#xff1a; 視口容器元…

【linux】linux查看某個已經啟動進程的環境變量及命令行信息 /proc/${pid}/environ cmdline

隨便找一個進程 yeqiangyeqiang-MS-7B23:~$ ps aux | grep Vir yeqiang 3538 0.4 0.6 1797056 210332 ? Sl 08:38 0:06 /usr/lib/virtualbox/VirtualBox 查看命令行 yeqiangyeqiang-MS-7B23:~$ strings /proc/3538/cmdline /usr/lib/virtualbox/VirtualBox …

Swift基礎知識:17.Swift結構體

在 Swift 中&#xff0c;結構體&#xff08;Structures&#xff09;是一種用來封裝一組相關的數據和功能的數據類型。結構體是一種值類型&#xff0c;它在傳遞和賦值時會被復制&#xff0c;與類&#xff08;Class&#xff09;不同&#xff0c;類是引用類型&#xff0c;它在傳遞…

python專業版破解激活(超詳細)

python專業版破解激活 1.下載pycharm應用程序 這里我使用的版本是pycharm-professional-2023.3.2 下載pycharm程序的連接為&#xff1a; 百度網盤 請輸入提取碼 提取碼為&#xff1a;nym0 2.安裝 選擇安裝路徑 下一步 這里全選 下一步 這里直接點擊安裝就可&#xff0c;其…

Opencv(2)深淺拷貝與基本繪圖(c++python

Opencv(2)深淺拷貝與基本繪圖 文章目錄 Opencv(2)深淺拷貝與基本繪圖三、深淺拷貝四、HSV色域(1).意義(2).cvtColor()(3).inRange()(4).適應光線 三、深淺拷貝 淺拷貝是指當圖像之間進行賦值時&#xff0c;圖像數據并未發生復制&#xff0c;而是兩個對象都指向同一塊內存塊。 …

光伏氣象站:實現自動化、高精度的氣象監測

型號推薦&#xff1a;云境天合 TH-FGF9】光伏氣象站是一種基于光伏技術的氣象監測設備&#xff0c;它利用太陽能轉化為電能&#xff0c;為氣象站提供持續的電力供應&#xff0c;并實現自動化、高精度的氣象監測。 光伏氣象站的工作原理可以分為以下幾個部分&#xff1a; 光伏發…

SpringCloud Nacos安裝

1. Nacos的下載&#xff1a;下載的是1.4的版本。 2. Nacos的安裝&#xff1a; startup.cmd -m standalone 以單機模式啟動Nacos。 登錄的賬號密碼 都是nacos。

Android LruCache源碼分析

文章目錄 Android LruCache源碼分析概述LruCache和LinkedHashMap關系源碼分析屬性寫入數據讀取數據刪除緩存 Android LruCache源碼分析 概述 LruCache&#xff08;Least Recently Used Cache&#xff0c;最近最少使用緩存&#xff09;是 Android 中的一種緩存機制。 根據數據…

MySQL 索引原理以及 SQL 優化

索引 索引&#xff1a;一種有序的存儲結構&#xff0c;按照單個或者多個列的值進行排序。索引的目的&#xff1a;提升搜索效率。索引分類&#xff1a; 數據結構 B 樹索引&#xff08;映射的是磁盤數據&#xff09;hash 索引&#xff08;快速鎖定內存數據&#xff09;全文索引 …

Day13-Linux系統用戶管理知識精講2

Day13-Linux系統用戶管理知識精講2 1. passwd 給用戶設置密碼2. chpasswd 批量設置密碼3. chage 查看和更改密碼屬性 更改用戶密碼過期信息4. 用戶組相關的命令了解 1. passwd 給用戶設置密碼 用戶自己給自己設置密碼直接passwd root用戶給普通用戶設置密碼passwd 用戶名。 …

ChatGPT調教指南 | 咒語指南 | Prompts提示詞教程(一)

在我們開始探索人工智能的世界時&#xff0c;了解如何與之有效沉浸交流是至關重要的。想象一下&#xff0c;你手中有一把鑰匙&#xff0c;可以解鎖與OpenAI的GPT模型溝通的無限可能。這把鑰匙就是——正確的提示詞&#xff08;prompts&#xff09;。無論你是AI領域的新手&#…

JS 筆記 --持續更新

this 指向調用 this 是執行上下文中的一個屬性&#xff0c;它指向最后一次調用這個方法的對象。 Function.apply(obj,args)方法能接收兩個參數 obj&#xff1a;這個對象將代替Function類里this對象 args&#xff1a;這個是數組&#xff0c;它將作為參數傳給Function&#xff08…

SpringCloud全家桶---常用微服務組件(1)

注冊中心: *作用: 服務管理 Eureka(不推薦)[讀音: 優瑞卡] Nacos(推薦) Zookeeper [讀音: 如k波] Consul [讀音:康壽] **注冊中心的核心功能原理(nacos)** 服務注冊: 當服務啟動時,會通過rest接口請求的方式向Nacos注冊自己的服務 服務心跳: NacosClient 會維護一個定時心跳持…