【问题标题】:Why my merge_sort in c++ is not working?为什么我在 C++ 中的 merge_sort 不起作用?
【发布时间】:2016-08-30 15:58:55
【问题描述】:

这是我在 C++ 中使用向量进行合并排序的代码。但这给我带来了奇怪的结果:

结果:

输入元素:11 33 12 44 99 34

已排序的元素:11 33 33 44 99 99

我的头文件没什么特别的:“stdafx.h”

#pragma once

#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <iostream>
using namespace std;

代码:

#include "stdafx.h"
#include <iostream>
#include<array>
#include<vector>

//#define array_size(array) (sizeof((array))/sizeof((array[0])))

using namespace std;
template <typename T>
void merge_sort(vector<T>& arr, vector<T>& arr1, vector<T>& arr2) {
    arr.clear();
    int i = 0, j = 0, k = 0;

    for (i = 0; i < arr1.size() && j < arr2.size(); k++) {
        if (arr1.at(i) <= arr2.at(j)) {
            arr.push_back(arr1.at(i));
            i++;
        }
        else if (arr1.at(i) > arr2.at(j)) {
            arr.push_back(arr1.at(j));
            j++;
        }
        k++;
    }
    while (i < arr1.size()) {
        arr.push_back(arr1.at(i));
        i++;
    }

    while (j < arr2.size()) {
        arr.push_back(arr2.at(j));
        j++;
    }

};

template <typename T>
vector<T>merge(std::vector<T>& arr) {
    if (1 < arr.size()) {
        vector<T> arr1(arr.begin(), arr.begin() + arr.size() / 2);
        merge(arr1);//dividing to size 1

        std::vector<T> arr2(arr.begin() + arr.size() / 2, arr.end());
        merge(arr2);
        merge_sort(arr, arr1, arr2);

    }
    return (arr);
    //write_vector(arr);
};


int main()
{
    //Merge Sort

    vector<int> inputVec;
    int size = 6;

    for (int i = 0; i < size; i++) {
        int input;
        cin >> input;
        inputVec.push_back(input);
    }

    vector<int>& newSort=merge(inputVec);
    vector<int>::iterator it;
    for (it = newSort.begin(); it != newSort.end(); ++it)
        cout<<endl<< *it << endl;
    return 0;
}

结果窗口: My Output 有人可以指出什么是错的吗?为什么会创建重复元素?

【问题讨论】:

  • 听起来您可能需要学习如何使用调试器来单步调试您的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programs
  • arr.push_back(arr1.at(j)); 错误。
  • vector&lt;int&gt;&amp; newSort=merge(inputVec); MS VS?这是非法的 C++ 代码。
  • 调试器是解决此类问题的正确工具。 在询问 Stack Overflow 之前,您应该逐行浏览您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
  • @Slava 你是对的!我同意你的看法。无论如何,该代码有很多问题。我不知道从哪里开始

标签: c++ c++11 vector mergesort


【解决方案1】:

在merge_sort函数中查看你的代码:

for (i = 0; i < arr1.size() && j < arr2.size(); k++) {
    if (arr1.at(i) <= arr2.at(j)) {
        arr.push_back(arr1.at(i));
        i++;
    }
    else if (arr1.at(i) > arr2.at(j)) {
        arr.push_back(arr1.at(j));
        //            ^^^^
        // It should be arr.push_back(arr2.at(j));
        j++;
    }
    k++;
}

将arr.push_back(arr1.at(j)); 替换为arr.push_back(arr2.at(j));,您的代码将像魅力一样工作。

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2017-06-12
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    相关资源
    最近更新 更多