排序算法之七:歸并排序(遞歸)

基本思想

基本思想:

歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為二路歸并。

核心步驟

歸并排序動圖:https://pic3.zhimg.com/v2-cdda3f11c6efbc01577f5c29a9066772_b.webp

先分割,再歸并?

數組的左邊有序,右邊也有序,那么怎么數組整體有序呢:取小的尾插到新數組

代碼示例

void _MergeSort(int* a, int begin, int end, int* tmp)
{if (begin >= end)return;int mid = (begin + end) / 2;_MergeSort(a, begin, mid, tmp);_MergeSort(a, mid + 1, end, tmp);//歸并int begin1 = begin, end1 = mid;//左區間int begin2 = mid + 1, end2 = end;//右區間int i = begin;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2])tmp[i++] = a[begin1++];elsetmp[i++] = a[begin2++];}while (begin1 <= end1)tmp[i++] = a[begin1++];while (begin2 <= end2)tmp[i++] = a[begin2++];memcpy(a + begin, tmp + begin, sizeof(int) * (end - begin + 1));
}
void MergeSort(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");return;}_MergeSort(a, 0, n - 1, tmp);free(tmp);
}

歸并排序的特性總結

  1. 歸并的缺點在于需要O(N)的空間復雜度,歸并排序的思考更多的是解決在磁盤中的外排序問題。
  2. 時間復雜度:O(N*logN)
  3. 空間復雜度:O(N)
  4. 穩定性:穩定

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

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

相關文章

C++:this指針

目錄 前言 成員函數返回this指向的對象本身時&#xff0c;為什是返回引用類型&#xff1f; 成員函數返回this對象本身時&#xff0c;內部通常會通過拷貝構造函數來創建一個臨時對象&#xff1f; 總結 前言 c通過提供特殊的對象指針&#xff0c;this指針 指向被調用的成員函…

openssl 常用命令 pkcs12

openssl pkcs12 openssl pkcs12 官方文檔 1. 描述 The pkcs12 command allows PKCS#12 files (sometimes referred to as PFX files) to be created and parsed. PKCS#12 files are used by several programs including Netscape, MSIE and MS Outlook. pkcs12 命令是用來創…

Nodejs 第二十二章(腳手架)

編寫自己的腳手架 那什么是腳手架&#xff1f; 例如:vue-cli Angular CLI Create React App 編寫自己的腳手架是指創建一個定制化的工具&#xff0c;用于快速生成項目的基礎結構和代碼文件&#xff0c;以及提供一些常用的命令和功能。通過編寫自己的腳手架&#xff0c;你可以…

Linux和Windows環境下如何使用gitee?

1. Linux 1.1 創建遠程倉庫 1.2 安裝git sudo yum install -y git 1.3 克隆遠程倉庫到本地 git clone 地址 1.4 將文件添加到git的暫存區&#xff08;git三板斧之add&#xff09; git add 文件名 # 將指定文件添加到git的暫存區 git add . # 添加新文件和修改過的…

深入理解HTTP狀態碼及其在Web開發中的應用

在Web開發中&#xff0c;我們經常需要與服務器進行交互&#xff0c;以獲取或發送數據。為了實現這一目標&#xff0c;我們使用HTTP協議。HTTP協議是一種無狀態的、應用層的協議&#xff0c;它定義了客戶端和服務器之間的通信方式。在HTTP協議中&#xff0c;有五種常用的HTTP狀態…

Python高級算法——動態規劃

Python中的動態規劃&#xff1a;高級算法解析 動態規劃是一種解決多階段決策問題的數學方法&#xff0c;常用于優化問題。它通過將問題分解為子問題&#xff0c;并在解決這些子問題的基礎上構建全局最優解。在本文中&#xff0c;我們將深入講解Python中的動態規劃&#xff0c;…

vs2017+qt5.14.2遇到的問題

1、在安裝qt插件后&#xff0c;導入pro文件時&#xff0c;報 msvc-version.conf loaded but QMAKE_MSC_VER isn’t set 修改E:\Qt\Qt5.14.2\5.14.2\msvc2017_64\mkspecs\common\msvc-version.conf文件中添加

RabbitMQ學習筆記10 綜合實戰 實現新商家規定時間內上架商品檢查

配置文件&#xff1a; 記住添加這個。 加上這段代碼&#xff0c;可以自動創建隊列和交換機以及綁定關系。 我們看到了我們創建的死信交換機和普通隊列。 我們可以看到我們隊列下面綁定的交換機。 我們創建一個controller包進行測試: 啟動&#xff1a; 過一段時間會變成死信隊列…

elasticsearch|大數據|elasticsearch的api部分實戰操作以及用戶和密碼的管理

一&#xff0c; 前言 本文主要內容是通過elasticsearch的api來進行一些集群的管理和信息查詢工作&#xff0c;以及elasticsearch用戶的增刪改查和密碼的重設以及重置如何操作 接上文&#xff1a;elasticsearch|大數據|elasticsearch低版本集群的部署安裝和安全增強---密碼設…

SSM與SpringBoot面試題總結

什么是spring&#xff1f;談談你對IOC和AOP的理解。 Spring:是一個企業級java應用框架&#xff0c;他的作用主要是簡化軟件的開發以及配置過程&#xff0c;簡化項目部署環境。 Spring的優點: 1、Spring低侵入設計&#xff0c;對業務代碼的污染非常低。 2、Spring的DI機制將…

FPGA設計時序約束十一、others類約束之Set_Maximum_Time_Borrow

目錄 一、序言 二、Set Maximum Time Borrow 2.1 基本概念 2.2 設置界面 2.3 命令語法 2.4 命令示例 三、參考資料 一、序言 在Vivado的時序約束窗口中&#xff0c;存在一類特殊的約束&#xff0c;劃分在others目錄下&#xff0c;可用于設置忽略或修改默認的時序路徑分析…

IntelliJ IDEA開啟git版本控制的簡單教程

這篇文章想要分享一下怎么在IntelliJ IDEA開啟版本控制&#xff0c;博主使用的是gitee&#xff0c;首先需要安裝git&#xff0c;關于git的安裝這里就不介紹了&#xff0c;很簡單。 目錄 創建git倉庫 創建項目 開啟版本控制 拉取項目 創建git倉庫 首先&#xff0c;需要登錄…

《Linux中lsof的神奇探秘:打開文件的魔法與更多相似利器》

前言 在Linux的世界里&#xff0c;lsof&#xff08;List Open Files&#xff09;是一個強大的工具&#xff0c;它能幫助我們輕松查看系統上打開的文件及網絡連接。然而&#xff0c;除了lsof之外&#xff0c;還有一些與它功能相似且同樣強大的命令等待著我們去發現。本文將引領…

MATLAB | 官方舉辦的動圖繪制大賽 | 第四周(收官周)賽情回顧

MATHWORKS官方舉辦的迷你黑客大賽第三期(MATLAB Flipbook Mini Hack)圓滿結束&#xff0c;雖然我的水平和很多大佬還有比較大的差距&#xff0c;但所有獎也算是拿滿了&#xff1a; 專家評選前三名&#xff0c;以及投票榜前十&#xff1a;~ 每周的階段性獲獎者&#xff1a; 下面…

【Python】手把手教你用tkinter設計圖書管理登錄UI界面(三)

上一篇&#xff1a;【Python】手把手教你用tkinter設計圖書管理登錄UI界面&#xff08;二&#xff09;-CSDN博客 下一篇&#xff1a; 緊接上一篇文章&#xff0c;繼續完善項目功能&#xff1a;用戶登錄。由于老王的注冊部分有億點點復雜&#xff0c;還沒完成&#xff0c;但是…

ngixn 準備

確認yum可用&#xff0c;確認防火墻&#xff0c;確認SELinux 一項安裝 yum -y install gcc make automake pcre-devel zlib zlib-devel openssl openssl-devel參數&#xff1a; gcc&#xff1a;編譯依賴gcc環境 pcre&#xff1a;PCRE(Perl Compatible Regular Expressions)是一…

鴻蒙OS應用開發的開發環境

鴻蒙OS應用開發的開發環境 鴻蒙系統發展越來越快&#xff0c;已經開始走進千家萬戶&#xff0c;從手機到電視機&#xff0c;再到汽車&#xff0c;以后各種手表、智能設備等等。這已經是一個廣泛應用的操作系統&#xff0c;也是跟大家生活密切相關的操作系統。要想在這個平臺上…

Git命令---查看遠程倉庫

介紹 使用git命令查看綁定的遠程倉庫。 命令 git remote -v

Kubernetes里的DNS;API資源對象ingress;Kubernetes調度;節點選擇器NodeSelector;節點親和性NodeAffinity

Kubernetes里的DNS K8s集群內有一個DNS服務&#xff1a; kubectl get svc -n kube-system |grep dns測試&#xff1a; 在tang3上安裝bind-utils,目的是安裝dig命令 yum install -y bind-utils apt install dnsutils #ubuntu上 解析外網域名 dig 10.15.0.10 www.baidu.com…

NSSCTF-Crypto靶場練習--第11-20題wp

文章目錄 [SWPUCTF 2021 新生賽]traditional[LitCTF 2023]夢想是紅色的 (初級)[SWPUCTF 2021 新生賽]crypto2[羊城杯 2021]Bigrsa[LitCTF 2023]Hex&#xff1f;Hex&#xff01;(初級)[SWPU 2020]happy[AFCTF 2018]BASE[安洵杯 2019]JustBase[鶴城杯 2021]Crazy_Rsa_Tech[SWPUCT…