You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++新手求助:如何实现归并排序完整过程的步骤打印

实现归并排序的分步打印

嘿,作为C++新手想把归并排序的每一步都清晰打印出来太合理了!我看了你已经搭好的分治法代码框架,现在咱们把它补全,让拆分(divide)和合并(merge)的每一步都明明白白展示出来。

先看看你给出的初始代码(我帮你整理了格式):

#include <iostream>
using namespace std;
//prototype
void mergeSort2(int, int);
void merge2(int, int, int);
void printArray(int, int);
//input
int S[7] = { 38, 27, 43, 3, 9, 82, 10 };
//count divide and merge
int divideCount = 1;
int mergeCount = 1;
int main() {
    //show input
    printArray(0, 6);
    cout << endl;
    //start merge sort
    mergeSort2(0, 6);
    cout << "\n最终排序结果:";
    printArray(0, 6);
    return 0;
}

不过你的代码里mergeSort2、merge2和printArray都还没实现,接下来咱们把这几个函数补全,同时加上分步打印的逻辑。

完整实现代码

#include <iostream>
using namespace std;

// 函数声明
void mergeSort2(int left, int right);
void merge2(int left, int mid, int right);
void printArray(int left, int right);
void printIndent(int level); // 用于打印缩进,让分步结构更清晰

// 输入数组
int S[7] = { 38, 27, 43, 3, 9, 82, 10 };
// 拆分和合并的计数
int divideCount = 1;
int mergeCount = 1;
// 用于控制缩进的层级,拆分时+1,合并时-1
int indentLevel = 0;

int main() {
    cout << "初始数组:";
    printArray(0, 6);
    cout << "\n\n开始归并排序过程:\n";
    mergeSort2(0, 6);
    cout << "\n最终排序结果:";
    printArray(0, 6);
    return 0;
}

// 打印数组的指定区间[left, right]
void printArray(int left, int right) {
    cout << "[";
    for (int i = left; i <= right; ++i) {
        cout << S[i];
        if (i != right) cout << ", ";
    }
    cout << "]";
}

// 打印缩进,让每一层拆分/合并的结构更直观
void printIndent(int level) {
    for (int i = 0; i < level; ++i) {
        cout << "  ";
    }
}

// 归并排序的拆分函数
void mergeSort2(int left, int right) {
    if (left < right) {
        int mid = (left + right) / 2;
        
        // 打印当前拆分步骤
        printIndent(indentLevel);
        cout << "第" << divideCount << "次拆分:将 ";
        printArray(left, right);
        cout << " 拆分为 ";
        printArray(left, mid);
        cout << " 和 ";
        printArray(mid+1, right);
        cout << "\n";
        divideCount++;
        indentLevel++;
        
        // 递归拆分左右子数组
        mergeSort2(left, mid);
        mergeSort2(mid + 1, right);
        
        indentLevel--;
        // 合并左右子数组
        merge2(left, mid, right);
    }
}

// 合并两个有序子数组的函数
void merge2(int left, int mid, int right) {
    int temp[7]; // 临时数组用于存储合并结果
    int i = left;    // 左子数组的起始索引
    int j = mid + 1; // 右子数组的起始索引
    int k = left;    // 临时数组的起始索引
    
    // 打印合并前的两个子数组
    printIndent(indentLevel);
    cout << "第" << mergeCount << "次合并:将 ";
    printArray(left, mid);
    cout << " 和 ";
    printArray(mid+1, right);
    cout << " 合并为 ";
    
    // 合并两个有序子数组到临时数组
    while (i <= mid && j <= right) {
        if (S[i] <= S[j]) {
            temp[k++] = S[i++];
        } else {
            temp[k++] = S[j++];
        }
    }
    // 复制左子数组剩余元素
    while (i <= mid) {
        temp[k++] = S[i++];
    }
    // 复制右子数组剩余元素
    while (j <= right) {
        temp[k++] = S[j++];
    }
    // 将临时数组的内容复制回原数组
    for (i = left; i <= right; ++i) {
        S[i] = temp[i];
    }
    
    // 打印合并后的结果
    printArray(left, right);
    cout << "\n";
    mergeCount++;
}

代码说明

  • 缩进层级indentLevel:用来控制每一步打印的缩进,拆分时层级加1,合并完成后层级减1,这样能直观看出归并排序的递归结构,哪一步属于哪一层的拆分/合并。
  • printIndent函数:根据当前层级打印空格,让输出的结构更清晰,像树状结构一样展示递归过程。
  • 拆分过程打印:每次拆分时,打印当前要拆分的数组,以及拆分成的两个子数组,并记录拆分次数。
  • 合并过程打印:每次合并前,打印要合并的两个有序子数组,合并完成后打印合并后的结果,并记录合并次数。

运行这段代码后,你就能看到从初始数组开始,每一次拆分、每一次合并的完整过程,完全符合你想要的分步展示需求。

内容的提问来源于stack exchange,提问作者Jenny Choi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:47:10