26考研——排序_插入排序(8)

408答疑


文章目錄

  • 二、插入排序
    • 基本概念
    • 插入排序方法
    • 直接插入排序
      • 算法描述
      • 示例
      • 性能分析
    • 折半插入排序
      • 改進點
      • 算法步驟
      • 性能分析
    • 希爾排序
      • 相關概念
      • 示例分析
      • 希爾排序的效率
        • 效率分析
        • 空間復雜度
        • 時間復雜度
  • 九、參考資料
    • 鮑魚科技課件
    • 26王道考研書


二、插入排序

基本概念

  • 定義:插入排序是一種簡單直觀的排序算法,其基本思想是每次將一個待排序的記錄按其關鍵字大小插入前面已排好序的子序列,直到全部記錄插入完成。

在這里插入圖片描述

插入排序方法

  • 直接插入排序:將待排元素往已排序好的序列進行插入,叫做直接插入排序。

  • 折半插入排序:由插入排序的思想可以引申出折半插入排序。

  • 希爾排序:由插入排序的思想可以引申出希爾排序。

直接插入排序

算法描述

  • 基本思想:直接插入排序是一種最簡單也最直觀的排序算法。其基本思想是每次將一個待排序的記錄按其關鍵字大小插入前面已排好序的子序列,直到全部記錄插入完成。

在這里插入圖片描述

  • 操作步驟:要將元素 L ( i ) L(i) L(i) 插入已有序的子序列 L [ 1... i ? 1 ] L[1...i-1] L[1...i?1],需要執行以下操作(下面用 L [ ] L[] L[] 表示一個表,而用 L ( ) L() L() 表示一個元素):

    1. 查找出 L ( i ) L(i) L(i) L [ 1... i ? 1 ] L[1...i-1] L[1...i?1] 中的插入位置 k k k
    2. L [ k . . . i ? 1 ] L[k...i-1] L[k...i?1] 中的所有元素依次后移一個位置。
    3. L ( i ) L(i) L(i) 復制到 L ( k ) L(k) L(k)
  • 實現過程:為了實現對 L [ 1... n ] L[1...n] L[1...n] 的排序,可以將 L ( 2 ) L(2) L(2) L ( n ) L(n) L(n) 依次插入前面已排好序的子序列,初始 L [ 1 ] L[1] L[1] 可以視為一個已排好序的子序列。

  • 執行次數:共進行 n ? 1 n-1 n?1 次插入操作(從 L ( 2 ) L(2) L(2) L ( n ) L(n) L(n))。

  • 原地排序:僅需常數級輔助空間,空間復雜度為 O ( 1 ) O(1) O(1)

示例

  • 初始序列 4 9 1 , 38 , 65 , 97 , 76 , 13 , 27 , 4 9 2 49_1, 38, 65, 97, 76, 13, 27, 49_2 491?,38,65,97,76,13,27,492?

  • 排序過程
    初始時 49 可以視為一個已排好序的子序列,按照上述算法進行直接插入排序的過程如下圖所示,括號內是已排好序的子序列。

在這里插入圖片描述

性能分析

  • 空間效率:僅使用了常數個輔助單元,因而空間復雜度為 O ( 1 ) O(1) O(1)

  • 時間效率

    • 在排序過程中,向有序子表中逐個地插入元素的操作進行了 n ? 1 n-1 n?1 趟,每趟操作都分為比較關鍵字和移動元素,而比較次數和移動次數取決于待排序表的初始狀態。
    • 在最好情況下,表中元素已經有序,此時每插入一個元素,都只需比較一次而不用移動元素,因而時間復雜度為 O ( n ) O(n) O(n)
    • 在最壞情況下,表中元素順序剛好與排序結果中的元素順序相反(逆序),總的比較次數達到最大,總的移動次數也達到最大,總的時間復雜度為 O ( n 2 ) O(n^2) O(n2)
    • 平均情況下,考慮待排序表中元素是隨機的,此時可以取上述最好與最壞情況的平均值作為平均情況下的時間復雜度,總的比較次數與總的移動次數約為 n 2 / 4 n^2/4 n2/4
    • 因此,直接插入排序算法的時間復雜度為 O ( n 2 ) O(n^2) O(n2)
  • 穩定性:因為每次插入元素時總是從后往前先比較再移動,所以不會出現相同元素相對位置發生變化的情況,即直接插入排序是一個穩定的排序算法。

  • 適用性:直接插入排序適用于順序存儲和鏈式存儲的線性表,采用鏈式存儲時無須移動元素。

折半插入排序

改進點

  • 折半插入排序算法對直接插入排序算法進行了改進,主要在于查找待插入元素位置的方法。通過使用折半查找來確定待插入元素的位置,從而減少比較次數。

算法步驟

  1. 將待插入的元素暫存到數組的第一個位置。
  2. 使用折半查找確定該元素在已排序子序列中的正確位置。
  3. 從后向前移動元素,為新元素騰出空間。
  4. 將新元素插入到正確的位置。

性能分析

  • 時間復雜度:折半插入排序的時間復雜度約為 O ( n log ? 2 n ) O(n\log_2 n) O(nlog2?n),這是因為折半查找減少了比較元素的次數。然而,由于元素的移動次數并未改變,總的時間復雜度仍為 O ( n 2 ) O(n^2) O(n2)。對于數據量不大的排序表,折半插入排序往往能表現出很好的性能。

  • 穩定性:折半插入排序是一種穩定的排序算法,因為它在插入元素時總是從后往前先比較再移動,不會出現相同元素相對位置發生變化的情況。

  • 適用性:折半插入排序僅適用于順序存儲的線性表,因為它依賴于順序存儲的線性結構來實現折半查找和元素的移動。

希爾排序

相關概念

  • 基本思想:希爾排序是基于直接插入排序進行改進而得來,又稱縮小增量排序。它更適用于基本有序的排序表和數據量不大的排序表。

  • 排序過程:先將待排序表分割成若干形如 L [ i , i + d , i + 2 d , ? , i + k d ] L[i, i+d, i+2d, \cdots, i+kd] L[i,i+d,i+2d,?,i+kd] 的“特殊”子表,即相隔某個“增量”的記錄組成一個子表,對各個子表分別進行直接插入排序,當整個表中的元素已呈“基本有序”時,再對全體記錄進行一次直接插入排序。

  • 增量選擇:先取一個小于 n n n 的增量 d 1 d_1 d1?,把表中的全部記錄分成 d 1 d_1 d1? 組,所有距離為 d 1 d_1 d1? 的倍數的記錄放在同一組,在各組內進行直接插入排序;然后取第二個增量 d 2 < d 1 d_2 < d_1 d2?<d1?,重復上述過程,直到所取到的 d i = 1 d_i = 1 di?=1,即所有記錄已放在同一組中,再進行直接插入排序,由于此時已經具有較好的局部有序性,因此可以很快得到最終結果。

  • 穩定性:當相同關鍵字的記錄被劃分到不同的子表時,可能會改變它們之間的相對次序,因此希爾排序是一種不穩定的排序算法。

  • 適用性:希爾排序僅適用于順序存儲的線性表。

示例分析

在這里插入圖片描述

希爾排序的效率

效率分析
  • 希爾排序的效率很高,盡管它也屬于插入排序的一種,但其高效的原因有兩個:
    1. 對于直接插入排序來說,數據量越小,效率越高。
    2. 對于直接插入排序來說,數據基本有序時,效率越高。
空間復雜度
  • 僅使用了常數個輔助單元,因此空間復雜度為 O ( 1 ) O(1) O(1)
時間復雜度
  • 增量序列的影響:希爾排序的時間復雜度依賴于所取“增量”序列的函數,這涉及一些數學上尚未解決的難題。

  • 特定情況下的時間復雜度: 當增量序列為 d l t a [ k ] = 2 t ? k + 1 ? 1 dlta[k] = 2^{t-k+1} - 1 dlta[k]=2t?k+1?1 時,希爾排序的時間復雜度為 O ( n 3 / 2 ) O(n^{3/2}) O(n3/2),其中 t t t 為排序趟數, 1 ≤ k ≤ t ≤ ? log ? 2 ( n + 1 ) ? 1 \leq k \leq t \leq \lfloor \log_2(n+1) \rfloor 1kt?log2?(n+1)?

  • 實驗基礎上的推論:在大量的實驗基礎上推出:當 n n n 在某個特定范圍內,希爾排序所需的比較和移動次數約為 n 1.3 n^{1.3} n1.3,當 n → ∞ n \to \infty n 時,可減少到 n ( log ? 2 n ) 2 [ 2 ] n(\log_2 n)^{2^{[2]}} n(log2?n)2[2]

  • 最壞情況:在最壞情況下希爾排序的時間復雜度為 O ( n 2 ) O(n^2) O(n2)

九、參考資料

鮑魚科技課件

b站免費王道課后題講解:
在這里插入圖片描述

網課全程班:
在這里插入圖片描述

26王道考研書

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

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

相關文章

精華貼分享|從不同的交易理論來理解頭肩形態,殊途同歸

本文來源于量化小論壇策略分享會板塊精華帖&#xff0c;作者為孫小迪&#xff0c;發布于2025年2月17日。 以下為精華帖正文&#xff1a; 01 前言 學習了一段時間交易后&#xff0c;我發現在幾百年的歷史中&#xff0c;不同門派的交易理論對同一種市場特征的稱呼不一樣&#x…

leetcode437.路徑總和|||

對于根結點來說&#xff0c;可以選擇當前結點為路徑也可以不選擇&#xff0c;但是一旦選擇當前結點為路徑那么后續都必須要選擇結點作為路徑&#xff0c;不然路徑不連續是不合法的&#xff0c;所以這里分開出來兩個方法進行遞歸 由于力扣最后一個用例解答錯誤&#xff0c;分析…

北斗導航 | 改進奇偶矢量法的接收機自主完好性監測算法原理,公式,應用,RAIM算法研究綜述,matlab代碼

改進奇偶矢量法的接收機自主完好性監測算法研究 摘要 接收機自主完好性監測(RAIM)是保障全球導航衛星系統(GNSS)安全性的核心技術。針對傳統奇偶矢量法在噪聲敏感性、多故障隔離能力上的缺陷,本文提出一種基于加權奇偶空間與動態閾值的改進算法。通過引入觀測值權重矩陣重…

深度神經網絡全解析:原理、結構與方法對比

深度神經網絡全解析&#xff1a;原理、結構與方法對比 1. 引言 隨著人工智能的發展&#xff0c;深度神經網絡&#xff08;Deep Neural Network&#xff0c;DNN&#xff09;已經成為圖像識別、自然語言處理、語音識別、自動駕駛等領域的核心技術。相比傳統機器學習方法&#x…

經典論文解讀系列:MapReduce 論文精讀總結:簡化大規模集群上的數據處理

&#x1f9e0; MapReduce 論文解讀總結&#xff1a;簡化大規模集群上的數據處理 原文標題&#xff1a;MapReduce: Simplified Data Processing on Large Clusters 作者&#xff1a;Jeffrey Dean & Sanjay Ghemawat 發表時間&#xff1a;2004 年 發表機構&#xff1a;Google…

通過Appium理解MCP架構

MCP即Model Context Protocol&#xff08;模型上下文協議&#xff09;&#xff0c;是由Anthropic公司于2024年11月26日推出的開放標準框架&#xff0c;旨在為大型語言模型與外部數據源、工具及系統建立標準化交互協議&#xff0c;以打破AI與數據之間的連接壁壘。 MCP架構與Appi…

網頁版五子棋項目的問題處理

文章目錄 config.WebSocketConfig將鍵值對加?OnlineUserManager中線程安全、鎖ObjectMapper來處理json針對多開情況的判定處理連接關閉、異常&#xff08;玩家中途退出&#xff09;后的不合理操作游戲大廳數據更新 config.WebSocketConfig 把MatchAPI注冊進去 ? 在addHandle…

【初探數據結構】歸并排序與計數排序的序曲

&#x1f4ac; 歡迎討論&#xff1a;在閱讀過程中有任何疑問&#xff0c;歡迎在評論區留言&#xff0c;我們一起交流學習&#xff01; &#x1f44d; 點贊、收藏與分享&#xff1a;如果你覺得這篇文章對你有幫助&#xff0c;記得點贊、收藏&#xff0c;并分享給更多對數據結構感…

算法刷題記錄——LeetCode篇(8.7) [第761~770題](持續更新)

更新時間&#xff1a;2025-03-30 算法題解目錄匯總&#xff1a;算法刷題記錄——題解目錄匯總技術博客總目錄&#xff1a;計算機技術系列博客——目錄頁 優先整理熱門100及面試150&#xff0c;不定期持續更新&#xff0c;歡迎關注&#xff01; 763. 劃分字母區間 給你一個字…

Pod 網絡與 CNI 的作用

在 Kubernetes 中&#xff0c;Pod 網絡 是實現容器間通信的核心機制&#xff0c;每個 Pod 擁有獨立的 IP 地址&#xff0c;可直接跨節點通信。CNI&#xff08;Container Network Interface&#xff09; 是 Kubernetes 的網絡插件標準&#xff0c;負責為 Pod 分配 IP、配置網絡規…

使用keepalived結合tomcat和nginx搭建三主熱備架構

角色主機名軟件IP地址用戶client172.25.250.90keepalivedVIP172.25.250.100keepalivedVIP172.25.250.101keepalivedVIP172.25.250.102masterserverAkeepalived, nginx172.25.250.30backupserverBkeepalived, nginx172.25.250.31backupserverCkeepalived, nginx172.25.250.32web…

STRUCTBERT:將語言結構融入預訓練以提升深度語言理解

【摘要】最近&#xff0c;預訓練語言模型BERT&#xff08;及其經過穩健優化的版本RoBERTa&#xff09;在自然語言理解&#xff08;NLU&#xff09;領域引起了廣泛關注&#xff0c;并在情感分類、自然語言推理、語義文本相似度和問答等各種NLU任務中達到了最先進的準確率。受到E…

leetcode_977. 有序數組的平方_java

977. 有序數組的平方https://leetcode.cn/problems/squares-of-a-sorted-array/ 1.題目 給你一個按 非遞減順序 排序的整數數組 nums&#xff0c;返回 每個數字的平方 組成的新數組&#xff0c;要求也按 非遞減順序 排序。 示例 1&#xff1a; 輸入&#xff1a;nums [-4,-1…

Nginx—nginx.conf 配置結構詳解

一、nginx.conf 配置結構 函數 說明 main 全局配置 event 配置工作模式以及連接數 http http模塊相關配置 server 虛擬主機配置&#xff0c;可以有多個 location 路由規則&#xff0c;表達式 upstream 集群、內網服務器&#xff08;負載均衡也在這里邊配&#xff…

斐波那契數列----C語言

關于斐波那契 已知&#xff1a; 問題背景&#xff1a;一對兔子從第3個月開始每月生一對新兔子&#xff0c;新兔子同樣在第3個月開始繁殖。 關鍵觀察&#xff1a; 第1個月&#xff1a;1對&#xff08;初始兔子&#xff09;。 第2個月&#xff1a;1對&#xff08;未成熟&#…

vulhub靶場—— Tomcat8

目錄 一、漏洞描述 二、靶場搭建 三、漏洞復現 1、弱密碼 2、文件上傳 一、漏洞描述 環境描述&#xff1a; Tomcat 支持后臺部署 war 文件&#xff0c;可以直接將 webshell 部署到 web 目錄下。tomcat 默認的管理頁面 manager 使用 basic 認證用戶名和密碼登錄&#xff0…

使用 Spring AI Aliabab Module RAG 構建 Web Search 應用

使用 Spring AI Alibaba 構建大模型聯網搜索應用 Spring AI 實現了模塊化 RAG 架構&#xff0c;架構的靈感來自于論文“模塊化 RAG&#xff1a;將 RAG 系統轉變為類似樂高的可重構框架”中詳述的模塊化概念。 Spring AI 模塊化 RAG 體系 總體上分為以下幾個步驟&#xff1a; …

一些練習 C 語言的小游戲

一些練習 C 語言的小游戲 — 1. 猜數字游戲 描述&#xff1a;程序隨機生成一個數字&#xff0c;玩家需要猜測這個數字&#xff0c;并根據提示&#xff08;太高或太低&#xff09;調整猜測&#xff0c;直到猜中為止。 功能點&#xff1a; 隨機數生成 (rand() 函數)。循環和…

關于中文編程的一些思考

隨著信息化與數字化的發展&#xff0c;工業4.0時代亦將徐徐到來。當計算機的普及程度越來越高&#xff0c;數據的產生、傳輸、處理等變得越來越快、越來越大量的時候&#xff0c;人們想要自動化辦公的愿望也越來越強烈&#xff0c;希望能將自身從耗費腦力但是重復繁瑣的工作中解…

golang 日志log與logrus

目錄 一、Go 標準庫 log 詳解 1. 功能特點 2. 常用函數 3. 示例代碼 4. 優勢和局限 二、第三方庫 logrus 詳解 1. 功能特點 2. 核心功能 3. 示例代碼 4. 優勢和擴展性 三、總結 1. 何時選擇 log&#xff1f; 2. 何時選擇 logrus&#xff1f; 3. 對比總結 一、Go 標…