0

首先我不得不说我是算法和 C++ 的新手。在 vim 中编写此代码并调试此 c++ 代码后,我遇到了error:std:out_of_range 并且我不知道错误在哪里。所以我在这里,如果能得到您的帮助,我将非常感激。thx

#include <iostream>
#include <cstdio>
#include <ctime>
#include <cmath>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;
void merge(vector<int> &a, int first, int mid, int last)
{
    a.resize(last - first + 1);
    int n1 = mid - first + 1;
    int n2 = last - mid;
    vector<int> larray(n1, 0);
    vector<int> rarray(n2, 0);
    for (int i = 0; i != n1; ++i)
        larray.at(i) = a.at(first + i);
    for (int i = 0; i != n2; ++i)
        rarray.at(i) = a.at(mid + 1 + i);
    int i = 0;
    int j = 0;
    int k = 0;
    while (i < n1 && j < n2)
    {
        if (larray.at(k) <= rarray.at(i))
            a[k++] = larray[i++];
        else
            a[k++] = rarray[j++];
    }
    while (i < n1)
        a[k++] = larray[i++];
    while (j < n2)
        a[k++] = rarray[j++];
}

void MegerSort(vector<int> &a, int first, int last)
{
    if (first < last)
    {
        int mid = (first + last) / 2;
        MegerSort(a, first, mid );
        MegerSort(a, mid + 1, last);
        merge(a, first, mid, last);
    }
}

int main()
{
    vector<int> array;
    srand(unsigned(time(0)));
    for (int i = 0; i != 10; ++i)
        array.push_back(rand() % 10);
    for (vector<int>::iterator it = array.begin(); it != array.end(); ++it)
        cout<<*it<<" ";
    cout<<endl;
    MegerSort(array, 0, 9);
    for (vector<int>::iterator it = array.begin(); it != array.end(); ++it)
        cout<<*it<<" ";
    return 0;
}
4

1 回答 1

1

我认为有问题a.resize(last - first + 1);。你不应该这样做。

假设你打电话

void merge(vector<int> &a, int first, int mid, int last)

first = 6,mid = 7last = 8.

然后在调整大小后,a大小 = (8 - 6 + 1) = 3。

所以这将是一个问题-

rarray.at(i) = a.at(mid + 1 + i);你看mid + 1 = 8

于 2012-09-24T12:24:47.823 回答