首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言歸並排序算法詳解:合併兩個有序數組

     編輯:關於C

歸並排序 的核心操作是合併:將兩個已排序的序列合併為一個更大的有序序列。本文聚焦於「合併」本身——給定兩個升序數組,如何高效合併為一個升序數組。這既是歸並排序的關鍵子過程,也是獨立實用的算法模塊。

合併算法邏輯

  1. 準備三個索引:i 遍歷數組 A,j 遍歷數組 B,k 寫入結果數組 C。
  2. 比較 A[i] 與 B[j],將較小者放入 C[k],對應索引前移。
  3. 當一個數組耗盡,將另一數組剩餘元素直接拷貝到 C。

代碼實現

#include 
#include 

#define M 6
#define N 4

int main() {
    int a[M] = {-3, 6, 19, 26, 68, 100};
    int b[N] = {8, 10, 12, 22};
    int c[M+N];
    int i = 0, j = 0, k = 0, l;

    printf("a 數組元素:\n");
    for (l = 0; l < M; l++) printf("%d ", a[l]);
    printf("\n");

    printf("b 數組元素:\n");
    for (l = 0; l < N; l++) printf("%d ", b[l]);
    printf("\n");

    // 核心合併邏輯
    while (i < M && j < N) {
        if (a[i] <= b[j]) {
            c[k++] = a[i++];
        } else {
            c[k++] = b[j++];
        }
    }
    // 拷貝剩餘元素
    while (i < M) c[k++] = a[i++];
    while (j < N) c[k++] = b[j++];

    printf("合併後數組元素:\n");
    for (l = 0; l < M+N; l++) printf("%d ", c[l]);
    printf("\n");

    return 0;
}

運行結果

a 數組元素:
-3 6 19 26 68 100
b 數組元素:
8 10 12 22
合併後數組元素:
-3 6 8 10 12 19 22 26 68 100

算法特性分析

特性描述
時間複雜度O(M+N),線性掃描
空間複雜度O(M+N),需額外數組存儲結果
穩定性穩定(a[i] <= b[j] 保證相等元素 A 先於 B)
前提條件兩個輸入數組必須已排序

擴展:完整歸並排序

若要對單個無序數組排序,遞歸分治:

void merge_sort(int arr[], int left, int right) {
    if (left >= right) return;
    int mid = (left + right) / 2;
    merge_sort(arr, left, mid);
    merge_sort(arr, mid+1, right);
    merge(arr, left, mid, right);  // 合併兩個有序子數組
}

總結

合併兩個有序數組是歸並排序的基石,也是處理流式數據、外部排序、多路歸並的核心操作。掌握「雙指針比較、順序寫入、尾部拷貝」的標準模板,能靈活應對各類有序序列合併場景。實際開發中,C++ STL 的 std::merge、Java 的 Arrays.merge 等庫函數均基於此原理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved