合并排序程序对我要排序的数组没有任何作用

问题描述

我是C ++的新手,正在尝试实现合并排序,但是当我在我的main方法中打印数组时,它仍然保持不变,我不确定为什么会这样。我尝试打印分割后的数组的内容,但是它给了我不确定它来自何处的值。

#include <iostream>
#include <vector>
using namespace std;

void merge(vector<int> left,vector<int> right,vector<int> arr) {
    int j = 0;
    int k = 0;
    int l = 0;

    while (j < left.size() && k < right.size()) {
        if (left[j] >= right[k]) {
            arr[l] = right[k];
            k += 1;
            l += 1;
        } else {
            arr[l] = left[j];
            j += 1;
            l += 1;
        }
    }
    if (j < left.size()) {
        for (int i = j + k; i < arr.size(); i++) {
            j += 1;
            arr[i] = left[j];
        }
    }
    if (k < right.size()) {
        for (int i = j + k; i < arr.size(); i++) {
            k += 1;
            arr[i] = right[k];
        }
    }
}

void merge_sort(vector<int> arr) {
    int n = arr.size();
    if (n <2) {
        return;
    }
    int mid = n / 2;

    vector<int> left = vector<int>(arr.begin(),arr.end() - mid - 1);
    for (int i : left) {
        cout << i << " ";
    }
    cout << "\n";
    vector<int> right = vector<int>(arr.begin() + mid,arr.end());
    for (int i : right) {
        cout << i << " ";
    }
    cout << "\n";
    merge_sort(left);
    merge_sort(right);
    merge(left,right,arr);
}

int main() {
    vector<int> arr = {3,3,4,6,42,2};
    merge_sort(arr);
    for (int i : arr) {
        cout << i << " ";
    }
    return 0;
}

解决方法

当您将vector传递给merge_sort时,正在为其创建副本。对功能中的arr所做的任何更改将在main中不可见。

相反,如果您希望函数修改参数,则需要通过引用传递vector

void merge_sort(vector<int> &arr) {
                         // ^  by reference

merge类似:

void merge(vector<int> &left,vector<int> &right,vector<int> &arr) {

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...