歸并排序——有序序列的合并

目錄

1、簡述

2、復雜度

3、穩定性

4、例子


1、簡述

有序序列的合并(Merge of Sorted Sequences)是歸并排序的核心步驟之一。其目的是將兩個已經排序的序列合并成一個新的有序序列。這個過程在歸并排序中非常重要,因為歸并排序通過遞歸地將序列分割成子序列,然后合并這些子序列來實現排序。

實現步驟

  1. 創建臨時數組

    • 用于存儲兩個子序列的數據,以便合并操作。
  2. 雙指針法

    • 使用兩個指針分別指向兩個子序列的開頭。
    • 比較指針所指向的元素,將較小的元素放入臨時數組中,然后移動指針。
  3. 處理剩余元素

    • 當一個子序列的元素全部被處理完后,將另一個子序列的剩余元素直接復制到臨時數組中。
  4. 將臨時數組的內容復制回原數組

    • 合并完成后,將臨時數組中的數據復制回原數組對應的位置。

2、復雜度

  • 時間復雜度

    • O(n),其中 n 是兩個有序序列的總長度,因為每個元素都只處理一次。
  • 空間復雜度

    • O(n),需要額外的空間來存儲臨時數組。

3、穩定性

有序序列的合并是穩定的,因為在合并過程中,相同元素的相對位置不會改變。

4、例子

#include <iostream>
#include <vector>// 合并兩個有序子數組
void merge(std::vector<int>& arr, int left, int mid, int right) {int n1 = mid - left + 1;int n2 = right - mid;// 創建臨時數組std::vector<int> L(n1);std::vector<int> R(n2);// 復制數據到臨時數組 L[] 和 R[]for (int i = 0; i < n1; ++i)L[i] = arr[left + i];for (int i = 0; i < n2; ++i)R[i] = arr[mid + 1 + i];// 合并臨時數組到原數組int i = 0, j = 0, k = left;while (i < n1 && j < n2) {if (L[i] <= R[j]) {arr[k] = L[i];++i;} else {arr[k] = R[j];++j;}++k;}// 復制剩余元素(如果有)while (i < n1) {arr[k] = L[i];++i;++k;}while (j < n2) {arr[k] = R[j];++j;++k;}
}// 測試代碼
int main() {std::vector<int> array = {2, 5, 8, 1, 3, 7, 9, 10};int mid = (array.size() - 1) / 2;// 合并兩個有序序列 [2, 5, 8] 和 [1, 3, 7, 9, 10]merge(array, 0, mid, array.size() - 1);std::cout << "Merged array is \n";for (int num : array)std::cout << num << " ";std::cout << std::endl;return 0;
}

代碼說明

  1. merge 函數

    1. 參數arr 是待排序的數組,left 是左子數組的起始索引,mid 是左右子數組的分界點,right 是右子數組的結束索引。
    2. 步驟
      1. 創建并初始化兩個臨時數組 LR,分別存儲左子數組和右子數組的元素。
      2. 使用雙指針法將兩個子數組合并到原數組中。
      3. 處理任何剩余的元素,將其直接復制到原數組中。
  2. main 函數

    1. 創建一個示例數組并設定中間點。
    2. 調用 merge 函數合并兩個有序子數組。
    3. 輸出合并后的數組。

?快捷跳轉:?

  • 排序算法概述

生命不息,學習不止,若有不正確的地方,歡迎指正。

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

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

相關文章

技術職務管理助力智慧校園建設:深入解讀人事系統

智慧校園人事系統中的技術職務管理模塊&#xff0c;專注于高校及教育機構內技術人員及科研人員的職務管理&#xff0c;涵蓋職稱評審、技術職務任命、項目參與記錄、科研成果跟蹤及技術能力評估等多個方面&#xff0c;旨在通過信息化手段提升技術人才管理的效率與科學性。 在這一…

Windows如何安裝并啟動Nginx

0、前言 Nginx 是一款高性能、輕量級的Web服務器和反向代理服務器&#xff0c;廣泛應用于互聯網領域。它以其高效穩定、內存占用少和豐富的模塊化設計而受到開發者們的青睞。 在實際使用過程中&#xff0c;我們多數時候會在Linux系統上運行Nginx&#xff0c;但實際上&#xff…

單目行車測距攝像系統(單目測距-行車)

單目行車測距攝像系統是一種利用單個攝像頭實現車輛行駛中前方障礙物距離測量的技術。該系統通過計算機視覺算法&#xff0c;能夠實時分析攝像頭捕捉的圖像&#xff0c;精確計算出車輛與前方物體之間的距離&#xff0c;對于自動駕駛、高級駕駛輔助系統&#xff08;ADAS&#xf…

PMP考試沒通過別擔心,補救辦法來了

2024年6月PMP考試成績正在陸續分批次發布。沒有考試通過的同學就會疑問&#xff0c;考試沒考過怎么辦&#xff1f;可不可以補考&#xff1f;面對PMP考試沒通過的情況&#xff0c;我們應該如何應對呢&#xff1f; 首先要告訴大家一個好消息&#xff01;6月考試不通過的考生可以…

24年hvv不要掉進秘網了,特別別被反制了

這兩年的hvv&#xff0c;防守方已經不單單是每天坐那看監控、封ip了&#xff0c;越來越多的大佬投身防守工作中&#xff0c;讓防守從被動變成了一個主動的活了。 目前最常見的主動防守有2種&#xff0c;1、長時間的蜜罐運營。2、蜜罐反制。 01-蜜罐運營 蜜罐這個詞干安全的都…

七、函數練習

目錄 1. 寫一個函數可以判斷一個數是不是素數。&#xff08;素數只能被1或其本身整除的數&#xff09; 2. 一個函數判斷一年是不是閏年。 3.寫一個函數&#xff0c;實現一個整形有序數組的二分查找。 4. 寫一個函數&#xff0c;每調用一次這個函數&#xff0c;使得num每次增…

基于PHP花澗訂購系統的設計與實現00332

摘 要 近年來&#xff0c;電子商務的快速發展引起了行業和學術界的高度關注。花澗訂購系統旨在為用戶提供一個簡單、高效、便捷的花卉購物體驗&#xff0c;它不僅要求用戶清晰地查看所需信息&#xff0c;而且還要求界面設計精美&#xff0c;使得功能與頁面完美融合&#xff0c;…

PIL,OpenCV,Pytorch處理圖像時的通道順序(顏色,長寬深)

項目顏色通道順序長寬通道順序數據類型取值范圍PILRGBHWCndarray0-255 (byte)OpenCVBGRHWCndarray0-255 (byte)PyTorchRGB/BGR (取決于如何讀取)(N)CHWtensor0-1 (float, 標準化后); 0-255 (int, 未標準化) 注意以下幾點&#xff1a; 顏色通道順序&#xff1a;PIL默認使用RGB順…

圖像增強方法匯總OpenCV+python實現【第二部分:高級圖像增強方法】

圖像增強方法匯總OpenCV+python實現【第二部分:高級圖像增強方法】 前言高級圖像增強方法1. 隨機高斯模糊(Random Gaussian Blur)2. 隨機灰度(Random Grayscale)3. 隨機通道交換(Random Channel Swap)4. 隨機伽馬校正(Random Gamma Correction)5. 隨機透視變換(Rando…

監控易在某市電子政務外網的運維應用案例

隨著信息技術的飛速發展&#xff0c;電子政務已經成為政府提升服務效率、增強公眾滿意度的重要途徑。某市電子政務外網作為該市政府部門與外界交互的主要平臺&#xff0c;承載著大量關鍵業務與數據交互&#xff0c;其網絡環境的復雜性、應用特點的多樣性以及運維需求的挑戰性&a…

AI程序員還是代替不了程序員,震撼硅谷的Devin-ai程序員,再度震撼硅谷——但這次是被打假

文章目錄 主要疑點包括但不限于&#xff1a;35年從業者逐幀驗證 AI程序員還是代替不了程序員&#xff0c;震撼硅谷的Devin-ai程序員&#xff0c;再度震撼硅谷——但這次是被打假 一位油管程序員博主Internet of Bugs對Devin發布的視頻進行了逐幀分析&#xff0c;逐一舉證說明了…

【C語言】register 關鍵字

在C語言中&#xff0c;register關鍵字用于提示編譯器將變量盡量存儲在CPU的寄存器中&#xff0c;而不是在內存中。這是為了提高訪問速度&#xff0c;因為寄存器的訪問速度比內存快得多。使用register關鍵字的變量通常是頻繁使用的局部變量。 基本用法 void example() {regist…

貓頭虎分享[可靈AI」官方推薦的馴服指南-V1.0

貓頭虎分享[可靈AI」官方推薦的馴服指南-V1.0 貓頭虎是誰&#xff1f; 大家好&#xff0c;我是 貓頭虎&#xff0c;別名貓頭虎博主&#xff0c;擅長的技術領域包括云原生、前端、后端、運維和AI。我的博客主要分享技術教程、bug解決思路、開發工具教程、前沿科技資訊、產品評…

Git 基礎-創建版本庫 git init、添加到暫存區git add、查看狀態git status、查看改動git diff

目錄 1.創建版本庫 git init 1.創建版本庫 git init 在目錄中創建新的 Git 倉庫。 你可以在任何時候、任何目錄中這么做&#xff0c;完全是本地化的。 在目錄中執行 git init&#xff0c;就可以創建一個 Git 倉庫了。 注意: 沒事不要手動修改 .git 目錄里面的文件&#xff0c;不…

Nginx Http緩存的必要性!啟發式緩存有什么弊端?

&#x1f440; Nginx Http緩存的必要性&#xff01;啟發式緩存有什么弊端&#xff1f; 簡介啟發式緩存引發的問題nginx緩存配置 簡介 我們在使用React或者Vue開發項目中會使用hash、chunkhash、contenthash來給靜態資源文件進行命名。這帶來的好處便是當我們部署完項目后&…

安卓微商大師V3.4.0/高級版一鍵群發僵尸粉檢測

一款高效獲取客源&#xff0c;備受好評的微商工具&#xff0c;資源豐富&#xff0c;秒速獲得客源&#xff0c;大量群客源&#xff0c;都是散客&#xff0c;攜手創業&#xff0c;是做微商生意的首選工具。打開即是黑鉆高級會員 趕快體驗吧 很強大 鏈接&#xff1a;https://pan.…

2023ICPC亞洲區域賽(合肥)VP補題題解(48th)

2023ICPC亞洲區域賽(合肥)VP補題題解記錄 文章目錄 2023ICPC亞洲區域賽(合肥)VP補題題解記錄寫在前面已更新 E F G J&#xff0c;待更新 B I C F and E(簽到題和簡單題)G. Streak Manipulation題目大意題目分析ac代碼參考 J. Takeout Delivering題目大意題目分析ac代碼參考 寫在…

CSS-position/transform

1 需求 2 語法 在CSS中&#xff0c;positioning 和 transform 是兩個非常重要的概念&#xff0c;它們分別用于控制元素在頁面上的布局和變換。 Positioning CSS中的position屬性用于設置元素的定位類型。它有幾個值&#xff0c;包括&#xff1a; static&#xff1a;這是默認…

51單片機第12步_使用stdio.h庫函數仿真串口通訊

本章介紹如何使用stdio.h庫函數仿真串口通訊&#xff0c;學會使用view下面的“serial window #1”,實現模擬串口通訊。 Keil C51中有一些關鍵字&#xff0c;需要牢記&#xff1a; interrupt0:指定當前函數為外部中斷0&#xff1b; interrupt1:指定當前函數為定時器0中斷&…

MAC下的PDM工具

還在為MAC電腦下數據庫設計發愁嗎&#xff1f;從Windows切換到MAC&#xff0c;除了因為做蘋果開發以外&#xff0c;更大的一個理由是不想被工具束縛&#xff0c;使用習慣不一樣&#xff0c;不要緊。就像錢一樣&#xff0c;當我們成為錢的習慣就成為錢的奴隸了。但是用MAC一年多…