C++歸并排序

1?算法核心思想

歸并排序是一種高效的排序方式,需要用到遞歸來實現,我們先來看一下動圖演示:

算法核心思想如下:

1.將數組盡量平均分成兩段。

2.將這兩段都變得有序(使用遞歸實現)。

3.將兩段合并。

2 代碼實現

首先,我們先定義一個歸并排序的函數,里面接受三個參數:

void MergeSort(int arr[], int left, int right) {}

arr代表需要進行排序的數組,left表示數組arr的最左端點,right表示數組arr的最右端點。

首先我們需要把數組分成兩段,我們可以用二分的方法:

int mid = (left + right) >> 1;

這里右移(>>為右移運算符)1為和除以2含義相同。

也可以用防溢出,因為left+right的值可能會爆int,導致結果錯誤:

int mid = left + (right - left) >> 1;

然后對兩段分別進行遞歸,第一段是[1, mid],第二段是[mid+1, right]:

MergeSort(arr, left, mid);
MergeSort(arr, mid + 1, right);

由于我們需要對數組進行操作,但是直接在arr操作可能會導致原始數據丟失,但是如果再創建一個數組會占用內存,所以我們可以向電腦“租借”right-left+1個空間,用關鍵字new來完成:

int* tmp = new int[right - left + 1];

注意要以指針的形式定義。

由于我們要把數組變得有序,而我們歸并排序的思想就是分而治之,然后再依次變得有序,需要用到分治的思想。那么我們先定義一些變量:

int cur = 0, cur1 = left, cur2 = mid + 1;

cur為tmp數組的元素下標,cur1為第一段的最左端點,cur2為第二段的最左端點。

然后我們對tmp數組和arr數組進行循環操作,這里可以用while循環,循環條件是cur1<=mid&&cur2<=right。

如果arr[cur1]比arr[cur2]更大,那么就先把arr[cur2]放回tmp,否則放arr[cur1]。

代碼:

while(cur1 <= mid && cur2 <= right)
{if(arr[cur1] < arr[cur2])tmp[cur++] = arr[cur1++];elsetmp[cur++] = arr[cur2++];
}

然后處理可能有的數組殘余未處理的部分:

while(cur1 <= mid)tmp[cur++] = arr[cur1++];
while(cur2 <= right)tmp[cur++] = arr[cur2++];

然后合并數組,方法跟處理時差不多的:

for(int i = 0; i < right - left + 1; i++)arr[left + i] = tmp[i];

就是把tmp的元素依次賦值給arr。

最有我們需要把tmp的空間還給內存,所以我們delete一下:

delete[] tmp;

然后我們的arr就變的有序了。

但是,如果這樣寫,程序就成功被我們干崩了,因為我們忘記寫遞歸出口了,補一個遞歸出口:

if(left == right)return;

我們合并一下整段代碼:

void MergeSort(int arr[], int left, int right) {if(left == right)return;int mid = (left + right) >> 1;MergeSort(arr, left, mid);MergeSort(arr, mid + 1, right);int* tmp = new int[right - left + 1];int cur = 0, cur1 = left, cur2 = mid + 1;while(cur1 <= mid && cur2 <= right){if(arr[cur1] < arr[cur2])tmp[cur++] = arr[cur1++];elsetmp[cur++] = arr[cur2++];}while(cur1 <= mid)tmp[cur++] = arr[cur1++];while(cur2 <= right)tmp[cur++] = arr[cur2++];for(int i = 0; i < right - left + 1; i++)arr[left + i] = tmp[i];delete[] tmp;
}

3 算法時間復雜度

正常情況下,歸并排序時間復雜度為:

O(NLogN)

再見!

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

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

相關文章

機器學習算法篇(四)決策樹算法

目錄 一、決策樹概述 1.1 概述 1.2 基本數學原理 二、熵原理形象解讀與計算 2.1 熵的概念 2.2 熵的計算示例 2.3 條件熵 三、決策樹構造實例 3.1 數據集示例 3.2 計算信息增益 3.3 遞歸構建決策樹 四、信息增益和信息增益率 4.1 信息增益的缺陷 4.2 信息增益率 4…

React 狀態管理入門:從 useState 到復雜狀態邏輯

作為前端新手&#xff0c;在學習 React 時&#xff0c;useState 往往是我們接觸的第一個 Hook。很多人最初會覺得它只能處理簡單的計數器之類的狀態&#xff0c;但實際上&#xff0c;useState 配合其他 Hook&#xff08;尤其是 useEffect&#xff09;可以輕松管理各種復雜狀態。…

DirectX 修復工具檢測 C++ 異常的七大解決方法

在使用電腦的過程中&#xff0c;尤其是在進行與圖形處理、游戲運行或多媒體應用相關的操作時&#xff0c;我們可能會用到 DirectX 修復工具。然而&#xff0c;有時這個工具在運行時會檢測到 C 異常&#xff0c;這無疑給我們帶來了困擾。那么&#xff0c;當遇到這種情況時&#…

0.2. RAII原則:嵌入式C++的基石 (Resource Acquisition Is Initialization)

在C語言的世界里&#xff0c;我們背負著一項沉重而危險的職責&#xff1a;手動管理所有資源。無論是 malloc 后的 free&#xff0c;fopen 后的 fclose&#xff0c;還是獲取互斥鎖后的釋放&#xff0c;程序員都必須在代碼的每一個可能的退出路徑上&#xff0c;確保資源被正確釋放…

Uniworld-V1、X-Omni論文解讀

目錄 一、Uniworld-V1 1、概述 2、架構 3、訓練過程 4、實驗 二、X-Omni 1、概述 2、方法 一、Uniworld-V1 1、概述 動機&#xff1a;當前統一模型雖然可以實現圖文理解和文本生成任務&#xff0c;但是難以實現圖像感知&#xff08;檢測/分割&#xff09;與圖像操控&am…

安全常見漏洞

一、OWASP Top 101.注入漏洞(1)SQL 注入原理&#xff1a;通過用戶輸入注入惡意SQL代碼示例&#xff1a;sql-- 惡意輸入OR 11 -- 可能被注入的SQL SELECT * FROM users WHERE username OR 11 AND password (2)防護措施&#xff1a;使用參數化查詢使用ORM框架實施最小權限原則…

管網遙測終端機——管網安全與效率的守護者

管網遙測終端機是一款智能化的管網監測與管理設備&#xff0c;它采用先進的物聯網技術和自動化控制技術&#xff0c;能夠全天候不間斷地對管網系統進行實時監測。該設備通過集成高精度傳感器、穩定可靠的通信模塊和強大的數據處理單元&#xff0c;構建了一套完整的管網運行數據…

AIIData商業版v1.4.1版本發布會

&#x1f525;&#x1f525; AllData大數據產品是可定義數據中臺&#xff0c;以數據平臺為底座&#xff0c;以數據中臺為橋梁&#xff0c;以機器學習平臺為中層框架&#xff0c;以大模型應用為上游產品&#xff0c;提供全鏈路數字化解決方案。 ?杭州奧零數據科技官網&#xff…

【Layui】調整 Layui 整體樣式大小的方法

Layui 的默認樣式確實偏大,但你可以通過以下幾種方法來調整整體大小: 使用縮放方法(最簡單) 在 HTML 的 中添加以下 CSS: <style> html {font-size: 14px; /* 調整基礎字體大小 */transform: scale(

MySQL連接數調優實戰:查看與配置

MySQL HikariCP 連接數調優實戰&#xff1a;如何查看用量 & 合理配置 max_connections 在做 Java 后端開發時&#xff0c;我們經常會遇到 MySQL 連接數配置問題&#xff0c;比如&#xff1a; max_connections 配多少合適&#xff1f;HikariCP 的 maximum-pool-size 要不要…

周志華院士西瓜書實戰(一)線性規劃+多項式回歸+邏輯回歸+決策樹

目錄 1. 線性規劃 2. 多項式回歸 3. 邏輯回歸手寫數字 4. Pytorch MNIST 5. 決策樹 1. 線性規劃 先生成 Y1.5X0.2ε 的&#xff08;X,Y&#xff09;訓練數據 兩個長度為30 import numpy as np import matplotlib.pyplot as plt def true_fun(X): # 這是我們設定的真實…

端到端供應鏈優化案例研究:需求預測 + 庫存優化(十二)

本篇文章聚焦于供應鏈中的庫存優化&#xff0c;技術亮點在于通過機器學習改進預測精度&#xff0c;成功將預測誤差降低25%&#xff0c;并在六個月內實現庫存過剩減少40%。該方法適用于需要優化庫存和提升服務水平的商業場景&#xff0c;特別是制藥行業&#xff0c;幫助企業在降…

Harbor 企業級實戰:單機快速上手 × 高可用架構搭建 × HTTPS安全加固

文章目錄一、建立項目二、命令行登錄harbor&#xff08;配置在客戶端即可&#xff09;三、給本地鏡像打標簽并上傳到harbor四、下載harbor的鏡像五、創建自動打標簽上傳鏡像腳本六、修改harbor配置七、實現harbor高可用7.1 安裝第二臺harbor主機7.2 新建目標&#xff0c;輸入第…

進程管理、系統高負載、cpu超過800%等實戰問題處理

進程管理與高負載實戰&#xff1a;CPU 飆到 800% 時的分析與處理 在生產環境中&#xff0c;系統高負載和 CPU 異常占用是運維工程師最常面對的場景之一。 這篇文章將從進程管理基礎講起&#xff0c;到高負載問題定位&#xff0c;再到CPU 占用 800% 的實戰處理&#xff0c;幫助你…

控制建模matlab練習12:線性狀態反饋控制器-①系統建模

此練習&#xff0c;主要是使用狀態空間方程來設計控制器的方法和思路&#xff1a; ①系統建模&#xff1b; ②系統的能控性&#xff1b; ③極點配置&#xff1b; ④最優化控制LQR&#xff1b; ⑤軌跡追蹤&#xff1b; 以下是&#xff0c;第①部分&#xff1a;系統建模&#xff…

bytearray和bytes

bytearray和bytes不一樣的地方在于&#xff0c;bytearray是可變的。 str 人生苦短&#xff0c;我用Python! bytes bytearray(str.encode()) bytes bytearray(b\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8Python!) str bytes.d…

護網行動之后:容器安全如何升級?微隔離打造內網“微堡壘”

護網行動剛剛落下帷幕&#xff0c;但這場沒有硝煙的攻防演練&#xff0c;留給安全行業的思考卻從未停止。當“橫向移動”成為攻擊方屢試不爽的殺手锏時&#xff0c;一個過去可能被忽視的角落——容器網絡安全&#xff0c;在本屆護網中被推到了前所未有的高度。面對云原生時代容…

一動鼠標就鎖屏,設備活動監控方案的技術實現與應用

摘要&#xff1a;本文探討基于本地化監控機制實現設備操作追蹤的技術方案&#xff0c;重點解析其觸發邏輯與隱私保護機制。方案適用于需要監控設備使用場景的技術人員。一、核心功能實現原理觸發監控機制鍵盤鉤子&#xff1a;通過系統級鍵盤事件監聽&#xff08;AltL組合鍵激活…

從零開始學習:深度學習(基礎入門版)(1天)

&#xff08;一&#xff09; opencv和opencv-contrib的安裝&#xff08;1.1&#xff09;在桌面地底部的搜索欄&#xff0c;搜索命令提示符&#xff0c;點擊并打開命令提示符&#xff08;1.2&#xff09;依次輸入命令并按回車&#xff1a;pip install opencv-python3.4.18.65 -i…

SimpleMindMap:一個強大的Web思維導圖

在信息爆炸的時代&#xff0c;如何高效地組織、記憶和表達復雜信息成為一項關鍵技能。思維導圖作為一種強大的可視化工具&#xff0c;能夠幫助我們理清思路、激發創意并提高學習效率。最近在逛github的時候發現了一個開源的思維導圖工具SimpleMindMap&#xff0c;和家人們分享下…