[數據結構]排序之 歸并排序(有詳細的遞歸圖解)

一、非遞歸

基本思想:
歸并排序( MERGE-SORT )是建立在歸并操作上的一種有效的排序算法 , 該算法是采用分治法( Divide andConquer)的一個非常典型的應用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為二路歸并。 歸并排序核心步驟:
歸并:如果左區間和右區間都有序,那么一次比較,小的尾插到新空間,鏈表可以摘下來插入,數組不行,得借助新空間
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void _MergeSort(int* a, int begin, int end, int* temp)
{if (begin>=end)return;int mid = (begin + end) / 2;//[begin,mid] [mid+1,end]如果這兩個區間有序,那么可以歸并了_MergeSort(a, begin, mid, temp);_MergeSort(a, mid+1, end, temp);//[begin, mid] [mid + 1, end]歸并int begin1 = begin, end1 = mid;int begin2 = mid+1, end2 = end;int i = begin;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){temp[i] = a[begin1];i++;begin1++;}else{temp[i] = a[begin2];i++;begin2++;}}//誰沒結束誰++來拷貝,由于不知道是哪個區間沒有結束,所有都寫一遍while (begin1 <= end1){temp[i] = a[begin1];i++;begin1++;}while (begin2 <= end2){temp[i] = a[begin2];i++;begin2++;}//等把所有數都放到temp數組上時,再拷貝回去memcpy(a+begin, temp+begin,sizeof(int)*(end-begin+1));
}
void MergeSort(int* a, int n)
{int* temp = (int*)malloc(sizeof(int) * n);if (temp == NULL){perror("malloc fail\n");return;}_MergeSort(a, 0, n - 1, temp);free(temp);
}
int main()
{int a[] = {10,6,7,1,3,9,4,2 };MergeSort(a,8);for (int i = 0; i < 8; i++){printf("%d ", a[i]);}return 0;
}

注:以下圖片看不清楚可以點進去放大看

二、遞歸?

不能用棧,棧是前序,而歸并是后序
方法:
能不能依次依次往后算?算完第一個和第二個后算第三個和第四個,再算第五個和第六個.......
第一次歸完后再拷貝回去后四個四個一歸.....

必須得注意細節:如果是奇數個數那么得注意邊界

?

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void Swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}
void _MergeSort(int* a, int begin, int end, int* temp)
{if (begin >= end)return;int mid = (begin + end) / 2;//[begin,mid] [mid+1,end]如果這兩個區間有序,那么可以歸并了_MergeSort(a, begin, mid, temp);_MergeSort(a, mid + 1, end, temp);//[begin, mid] [mid + 1, end]歸并int begin1 = begin, end1 = mid;int begin2 = mid + 1, end2 = end;int i = begin;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){temp[i] = a[begin1];i++;begin1++;}else{temp[i] = a[begin2];i++;begin2++;}}//誰沒結束誰++來拷貝,由于不知道是哪個區間沒有結束,所有都寫一遍while (begin1 <= end1){temp[i] = a[begin1];i++;begin1++;}while (begin2 <= end2){temp[i] = a[begin2];i++;begin2++;}//等把所有數都放到temp數組上時,再拷貝回去memcpy(a + begin, temp + begin, sizeof(int) * (end - begin + 1));
}
void MergeSort(int* a, int n)
{int* temp = (int*)malloc(sizeof(int) * n);if (temp == NULL){perror("malloc fail\n");return;}int gap = 1;while (gap < n){for (int i = 0; i < n; i += 2 * gap){int begin1 = i, end1 = i + gap - 1;int begin2 = i + gap, end2 = i + 2 * gap - 1;int j = i;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){temp[j] = a[begin1];j++;begin1++;}else{temp[j] = a[begin2];j++;begin2++;}}//誰沒結束誰++來拷貝,由于不知道是哪個區間沒有結束,所有都寫一遍while (begin1 <= end1){temp[j] = a[begin1];j++;begin1++;}while (begin2 <= end2){temp[j] = a[begin2];j++;begin2++;}//等把所有數都放到temp數組上時,再拷貝回去memcpy(a + begin, temp + begin, sizeof(int) * (end - begin + 1));}gap *= 2;}free(temp);
}
int main()
{int a[] = {10,6,7,1,3,9,4,2 };MergeSort(a,8);for (int i = 0; i < 8; i++){printf("%d ", a[i]);}return 0;
}

?

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

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

相關文章

docker安裝向量數據庫Milvus及可視化工具 Attu

前置條件 1.安裝了docker 2.服務器網絡正常&#xff0c;可以連接到容器下載地址 3.服務器磁盤空間正常&#xff0c;docker磁盤占用過大&#xff0c;請參考docker容量占用過大解決辦法 一、下載yml文件 可在文章資源下載或者自行下載&#xff1a;下載yml 下載這個單機版本的…

科技云報到:AI Agent打了個響指,商業齒輪加速轉動

科技云報到原創。 3月16日&#xff0c;百度旗下文心大模型4.5和文心大模型X1正式發布。目前&#xff0c;兩款模型已在文心一言官網上線&#xff0c;免費向用戶開放。 同時&#xff0c;文心大模型4.5已上線百度智能云千帆大模型平臺&#xff0c;企業用戶和開發者登錄即可調用AP…

CSS 用于圖片的樣式屬性

CSS 設置圖像樣式 CSS中用于圖片的樣式屬性主要包括以下幾個方面&#xff1a; ?邊框和背景?&#xff1a; ?border?&#xff1a;可以設置圖片的邊框樣式、寬度和顏色。例如&#xff0c;img { border: 1px solid #ddd; } 會給圖片添加1像素的實線邊框&#xff0c;顏色為灰色…

EasyExcel--導入和導出Excel的方法

原文網址&#xff1a;EasyExcel--導入和導出Excel的方法_IT利刃出鞘的博客-CSDN博客 簡介 本文介紹SpringBoot整合EasyExcel導入和導出Excel的方法。 使用 Excel導入 實體類 Data public class OrderImportBO {ExcelProperty("訂單號")NotBlank(message "…

金融級安全加速:群聯SD-WAN如何兼顧防御與低延遲?

一、SD-WAN的核心價值 1. 傳統回源痛點 暴露風險&#xff1a;公網回源可能泄露源站IP&#xff0c;易遭針對性攻擊。延遲抖動&#xff1a;跨國業務因網絡擁堵導致延遲波動&#xff08;如金融交易超時&#xff09;。 2. 群聯方案優勢 加密專線&#xff1a;通過IPSec/SSL VPN建…

Apache Tomcat漏洞公開發布僅30小時后即遭利用

近日&#xff0c;Apache Tomcat曝出一項安全漏洞&#xff0c;在公開發布概念驗證&#xff08;PoC&#xff09;僅30小時后&#xff0c;該漏洞即遭到攻擊者利用。這一漏洞編號為CVE-2025-24813&#xff0c;主要影響以下版本&#xff1a; 1. Apache Tomcat 11.0.0-M1 至 11.0.2 …

計算機體系結構作業2

1 P108 有一條動態多功能流水線由5段組成(如圖3.35所示),加法用1、3、4、5段,乘法用1、2、5段,第2段的時間為2△t,其余各段的時間均為△t,而且流水線的輸出可以直接返回輸入端或暫存于相應的流水寄存器中。若在該流水線上計算 ∑ i 4 ( A i B i ) \sum_i^4(A_iB_i) ∑i4?(Ai…

python-leetcode 60.分割回文串

題目&#xff1a; 給定一個字符串S,請將S分割成一些子串&#xff0c;使每個子串都是回文串&#xff0c;返回S所有可能的分割方案 方法一&#xff1a;回溯深度優先搜索 1. 主要思想 使用 深度優先搜索&#xff08;DFS&#xff09; 遍歷 s 的所有可能劃分方式。使用 回溯&…

Java EE 進階:MyBatis

MyBatis是一個優秀的持久化框架&#xff0c;用于簡化JDBC的開發。 持久層就是持久化訪問的層&#xff0c;就是數據訪問層&#xff08;Dao&#xff09;&#xff0c;用于訪問數據庫的。 MyBatis使用的準備工作 創建項目&#xff0c;導入mybatis的啟動依賴&#xff0c;mysql的驅…

Go語言的基礎類型

一基礎數據類型 一、布爾型&#xff08;Bool&#xff09; 定義&#xff1a;表示邏輯真 / 假&#xff0c;僅有兩個值&#xff1a;true 和 false內存占用&#xff1a;1 字節使用場景&#xff1a;條件判斷、邏輯運算 二、數值型&#xff08;Numeric&#xff09; 1. 整數類型&…

【愚公系列】《高效使用DeepSeek》019-外語學習

??【技術大咖愚公搬代碼:全棧專家的成長之路,你關注的寶藏博主在這里!】?? ??開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主! ?? 江湖人稱"愚公搬代碼",用七年如一日的精神深耕技術領域,以"…

發布第四代液晶電視,TCL引領全新美學境界

在不斷革新的消費電子領域中&#xff0c;電視行業在視覺體驗上正面臨重要的美學挑戰。如何打破全面屏時代的物理束縛&#xff0c;將家居空間提升到“視覺無界”的層次&#xff0c;以及如何讓尖端技術更好地服務于影像沉浸感&#xff0c;成為行業關注的焦點。 3月10日&#xff…

劍指 Offer II 113. 課程順序

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20113.%20%E8%AF%BE%E7%A8%8B%E9%A1%BA%E5%BA%8F/README.md 劍指 Offer II 113. 課程順序 題目描述 現在總共有 numCourses 門課需要選&#xff0c;記為 0 到 n…

【C++】STL庫面試常問點

STL庫 什么是STL庫 C標準模板庫&#xff08;Standard Template Libiary&#xff09;基于泛型編程&#xff08;模板&#xff09;&#xff0c;實現常見的數據結構和算法&#xff0c;提升代碼的復用性和效率。 STL庫有哪些組件 STL庫由以下組件構成&#xff1a; ● 容器&#xf…

【問題解決】Postman 測試報錯 406

現象 Tomcat 日志 org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.logException Resolved org.springframework.web.HttpMediaTypeNotAcceptableException: No acceptable representation HTTP狀態 406 - 不可接收 的報錯&#xff0c;核心原因 客…

第3節:AWK的特點和優勢

1 第3節&#xff1a;AWK的特點和優勢 AWK是一種功能強大的文本處理工具&#xff0c;具有以下特點和優勢&#xff1a; 1.1.1 簡潔性 AWK的語法簡潔明了&#xff0c;對于簡單的數據處理任務&#xff0c;通常只需編寫簡短的命令即可完成。例如&#xff0c;要從一個文本文件中提…

Flutter 打包 ipa出現錯誤問題 exportArchive

一、錯誤信息: Encountered error while creating the IPA: error: exportArchive: "Runner.app" requires a provisioning profile with the Push Notifications feature. Try distributing the app in Xcode: open /project/your_app/build/ios/archive/Runner.…

STC89C52單片機學習——第28節: [12-2] AT24C02數據存儲秒表(定時器掃描按鍵數碼管)

寫這個文章是用來學習的,記錄一下我的學習過程。希望我能一直堅持下去,我只是一個小白,只是想好好學習,我知道這會很難&#xff0c;但我還是想去做&#xff01; 本文寫于&#xff1a;2025.03.20 51單片機學習——第28節: [12-2] AT24C02數據存儲&秒表&#xff08;定時器掃…

Verilog-HDL/SystemVerilog/Bluespec SystemVerilog vscode 配置

下載 verible https://github.com/chipsalliance/verible的二進制包 然后配置 vscode

STM32使用HAL庫,模擬UART輸出字符串

測試芯片是STM32F103C8T6&#xff0c;直接封裝好了&#xff0c;波特率是 9600 MyDbg.h #ifndef __MYDBG_H #define __MYDBG_H #include "stm32f1xx_hal.h" #include <stdio.h> #include <stdarg.h>/*使用GPIO口 模擬 UART 輸出字符串 */ //初始化調試…