T:歸并排序

歸并排序

  • .逆序對簡介
  • .歸并排序
  • .習題

.逆序對簡介

\;\;\;\;\;\;\;\;簡單介紹一下歸并排序的原理,逆序對的基本概念,然后收集相關的練習。

直接用一個基礎問題來引入。
在這里插入圖片描述

因此知道了:
\;\;\;\;\;\;\;\;逆序對就是一對數滿足 i<j&&nums[i]>nums[j]i<j\&\&nums[i]>nums[j]i<j&&nums[i]>nums[j]。(當然這個圖片的題目是用record存儲數字)

.歸并排序

\;\;\;\;\;\;\;\;歸并排序的時間復雜度是O(nlogn)O(nlog^n)O(nlogn),從時間復雜度上來看,和快速排序并駕齊驅,但是由于快速排序會因為基準元素導致時間復雜度有概率退化,所以嚴格來說歸并排序比快速排序是更加穩定且快的。

歸并排序的核心思想:

  • 分解
  • 遞歸求解(將更小的子數組排序)
  • 合并 (將兩個排序后的子數組合并成一個有序數組)

通過遞歸解決子問題,最后一步步回溯解決最終的問題。

首先我會用一個示例來演示歸并排序的過程,然后計算其時間復雜度;那么歸并排序就介紹完了,后面將會持續更新題目。

有一個數組nums=[9,2,1,3,4,5,3,8,9],使用歸并排序將其從小到大排序

在這里插入圖片描述

從底層分析,歸并排序是從下往上的,先將子數組排序后,然后合并兩個排序后的子數組。最底層就是9和2,我們認為元素是排序好的,那么將兩個排序好的子數組合并為一個大的子數組,合并這個操作就可以將這個大的子數組排序完畢。(因為兩個子數組是有序的,所以可以使用雙指針輕松排序大的數組)。

歸并排序的代碼:


void merge(vector<int>&arr,vector<int>&temp,int left,int mid,int right)
{int i = left;    // 左子數組起始指針int j = mid + 1; // 右子數組起始指針int k = left;    // 臨時數組起始指針// 比較兩個子數組元素,將較小的放入臨時數組while (i <= mid && j <= right) {if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}// 處理左子數組剩余元素while (i <= mid) {temp[k++] = arr[i++];}// 處理右子數組剩余元素while (j <= right) {temp[k++] = arr[j++];}// 將臨時數組中的元素復制回原數組for (i = left; i <= right; i++) {arr[i] = temp[i];}
}void mergeSort(vector<int>&arr,vector<int>&temp,int left,int right)
{if(left<right){int mid=(left+right)/2;//分解子問題mergeSort(arr,temp,left,mid);mergeSort(arr,temp,mid+1,right);//合并merge(arr,temp,left,mid,right);}
}

那么如何計算時間復雜度。
其實上面的圖片可以很清楚看到,每一層都要合并n次,那么一共要合并lognlognlogn次,所以時間復雜度是O(nlogn)O(nlog^n)O(nlogn)
更具體地:

T(n) = 2*T(n/2) + n                  //1層:將n分解為2個n/2,合并耗時n= 2*[2*T(n/4) + n/2] + n        //2層:2個n/2分解為4個n/4,合并總耗時2*(n/2) = n= 4*T(n/4) + 2n                 = 8*T(n/8) + 3n                 // 第k層:2^k個子數組,每個大小n/2^k,合并總耗時k*n...= n*T(1) + log2(n)*n            //log2(n)層,最終T(1)=O(1)

.習題

1.交易逆序對的總數 原題

2.計算右側小于當前元素的個數原題

3.翻轉對原題

4.區間的個數原題

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

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

相關文章

三極管三種基本放大電路:共射、共集、共基放大電路

文章目錄一、共集放大電路1.靜態分析2.動態分析二、共基放大電路1.靜態分析2.動態分析總結如何判斷共射、共集、共基放大電路&#xff1f; 電路的輸入回路與輸出回路以發射極為公共端的電路稱為共射放大電路。 電路的輸入回路與輸出回路以集電極為公共端的電路稱為共集放大電路…

Function AI 助力用戶自主開發 MCP 服務,一鍵上云高效部署

作者&#xff1a;靖蘇 在 AI 與云原生協同創新的浪潮下&#xff0c;多模型、多場景智能應用日益普及。開發者面臨的首要挑戰&#xff0c;是如何實現模型之間、服務之間的高效協同&#xff0c;以及如何便捷地將自主研發能力拓展到云端&#xff0c;形成靈活可擴展的智能服務。MC…

c++編譯環境安裝(gcc、cmake)

一、gcc下載 下載地址&#xff1a;https://ftp.gnu.org/gnu/gcc/ 選擇想要下載的版本&#xff0c;然后解壓&#xff0c;查看 contrib/download_prerequisites 中的依賴。 以我下載的 gcc-7.3.0 為例&#xff0c; 二、安裝依賴包 【gmp】 https://ftp.gnu.org/gnu/gmp/ 【is…

基于貝葉斯的營銷組合模型實戰案例(PyMC實踐)

文章出自&#xff1a;基于營銷預算優化的媒體投入分配研究 本篇技術亮點在于結合了廣告飽和度和累積效應&#xff0c;通過數學模型和數值優化方法&#xff0c;精確計算電視與數字媒體的最佳預算分配比例&#xff0c;實現增量銷售最大化。該方法適合有多渠道廣告投放需求、預算…

react_05create-react-app腳手架詳細解析(export)

腳手架是什么&#xff1f; 是一種工具:快速生成項目的工程化結構&#xff0c;讓項目從搭建到開發&#xff0c;到部署&#xff0c;整個流程變得快速和便捷。 安裝過程: 1.安裝node,安裝完成后驗證版本,出現對應版本就表示成功 node --version npm --version2.React腳手架默認是使…

Uncaught TypeError: Illegal invocation

報錯信息Uncaught TypeError: Illegal invocation關鍵代碼$.operate.post(prefix "/edit", { "taskId": taskId, "taskStatus": completed });<input id"taskId" style"display: none;">[[${completeTask.taskId}]]&…

深入解析Go設計模式:責任鏈模式實戰

什么是責任鏈模式? 責任鏈模式(Chain of Responsibility Pattern)是一種行為設計模式,它通過構建處理者鏈來傳遞請求。每個處理者既能自行決定是否處理當前請求,也可將請求轉交給后續處理者。該模式的核心優勢在于解耦請求發送方與處理方,使多個對象都能獲得處理請求的機…

機器視覺系統工業相機的成像原理及如何選型

機器視覺系統是一種模擬人類視覺功能&#xff0c;通過光學裝置和非接觸式傳感器獲取圖像數據&#xff0c;并進行分析和處理&#xff0c;以實現對目標物體的識別、測量、檢測和定位等功能的智能化系統。其目的是讓機器能夠理解和解釋視覺信息&#xff0c;從而做出決策或執行任務…

Java如何快速實現短信登錄?

全文目錄&#xff1a;開篇語前言1. 短信登錄的工作原理2. 短信登錄的優點3. 短信登錄的缺點4. 短信登錄的實現示例&#xff1a;使用 Java 實現短信登錄的流程4.1 發送短信驗證碼&#xff08;偽代碼&#xff09;4.2 使用第三方短信平臺發送短信&#xff08;以阿里云為例&#xf…

HTML已死,HTML萬歲——重新思考DOM的底層設計理念

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

客戶管理系統的詳細項目框架結構

以下是針對客戶管理系統的詳細項目框架結構&#xff0c;整合了核心業務模塊&#xff08;客戶信息、合同管理、售前售后等&#xff09;&#xff0c;并補充了實用擴展模塊&#xff08;如數據統計、標簽管理等&#xff09;&#xff0c;嚴格遵循Django模塊化設計原則&#xff1a; c…

【01】OpenCV C#——C#開發環境OpenCvSharp 環境配置 工程搭建 及代碼測試

文章目錄一、OpenCV 介紹二、OpenCvSharp 介紹三、OpenCvSharp環境搭建3.1 創建新項目3.2 添加 NuGet組件3.3 代碼測試3.4 相較于 C OpenCV不同的之處四、LearnOpenCV有時候&#xff0c;單純c#做前端時會聯合C實現的dll來落地某些功能由于有時候會用C - Opencv實現算法后封裝成…

【解決辦法】報錯Found dtype Long but expected Float

Found dtype Long but expected Float錯誤通常發生在嘗試將一個數據類型為Long的張量傳遞給一個期望數據類型為Float的函數或操作時。在PyTorch中&#xff0c;Long和Float是兩種常見的數據類型&#xff0c;分別對應于64位整數和32位浮點數。某些函數或操作可能只接受特定數據類…

QtC++ 調用 tesseract開源庫 搭配 Opencv 實現文字識別:從tesseract庫基本介紹到實際應用實現

前言 在當今數字化時代&#xff0c;文字識別&#xff08;OCR&#xff09;技術已經滲透到我們生活和工作的方方面面&#xff0c;從掃描文檔的自動排版到車牌識別、票據信息提取等&#xff0c;都離不開 OCR 技術的支持。而在眾多 OCR 實現方案中&#xff0c;QtC 結合 tesseract 和…

數據集-目標檢測系列- 地球儀 數據集 globe>> DataBall

數據集-目標檢測系列- 地球儀 數據集 globe&#xff1e;&#xff1e; DataBall貴在堅持&#xff01;* 相關項目1&#xff09;數據集可視化項目&#xff1a;gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview2&#xff09;數據集訓練、推理相關項目&…

[Oracle] DUAL數據表

Oracle中的DUAL數據表是一個特殊的單行單列虛擬表結構&#xff1a;1行1列SELECT * FROM DUAL;輸出結果&#xff1a;列名默認DUMMY&#xff0c;值為X常見使用DUAL數據表的場景&#xff1a;1.系統函數調用測試當需要測試Oracle函數但不需要真實表數據時&#xff0c;我們可以考慮使…

第五篇: 深入解析基于 SQLAlchemy 的聊天記錄持久化模塊:`message_model` 與數據庫操作封裝

深入解析基于 SQLAlchemy 的聊天記錄持久化模塊:message_model 與數據庫操作封裝 作者:zgw 標簽:SQLAlchemy、Python、FastAPI、數據庫持久化、ORM、聊天系統、AI 應用開發 一、前言 在構建大模型應用(如聊天機器人、知識庫問答系統)時,對話記錄的持久化 是實現“可追溯…

學習游戲制作記錄(將各種屬性應用于戰斗以及實體的死亡)8.5

1.將各種屬性應用于戰斗我們希望將上節課的CharactorState腳本作為一個父類&#xff0c;而玩家和敵人的屬性狀態都是繼承自它的創建PlayerStats腳本&#xff1a;public class PlayerStats : CharactorState {private Player player;//獲取玩家腳本protected override void Star…

Higgsfield平替,地球轉場+動物豎中指AI視頻教程

大家好&#xff0c;這里是K姐。 一個幫助你把AI真正用起來的女子。 最近TikTok上的網友已經集體瘋魔了——刷到的視頻總以高空航拍開場&#xff0c;鏡頭從地球拉近后&#xff0c;要么是橘貓蹲在白宮草坪比中指&#xff0c;要么是柴犬在富士山頂比中指…… 這種堪比好萊塢運鏡…

界面規范的其他框架實現-列表-layui實現

另一個要改造的系統使用了layui&#xff0c;改造方式如下&#xff1a;斑馬線&#xff1a;.layui-table[lay-even] tr:nth-child(even) {background-color: #f2f2f2 }鼠標滑過&#xff1a;.layui-table tbody tr:hover{background-color: #8dccff }標題行&#xff1a;.layui-tab…