2012-09-24 3 views
0

먼저 알고리즘 및 C++에서 새로운 것입니다. vim에서이 코드를 작성한 후이 C++ 코드를 디버깅 할 때 error:std:out_of_range을 만났고 오류가 어디에 있는지 전혀 알지 못합니다. 그래서 여기에 나는, 나는 당신의 help.thxstd : out_of_range in mergesort

#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; 
} 
+1

당신이 어떤 라인을 얻을 수 있습니까 참조

rarray.at(i) = a.at(mid + 1 + i); problem- 될 것입니다 그 오류는? –

+0

@ LuchianGrigore이 컴파일러는이 코드를 gcc로 오류없이 컴파일하지만 .exe 파일을 실행할 때 오류 메시지가 표시됩니다. – skyline09

+2

그럼 실제로 디버깅하지 않았습니까? 닫는 투표 ... –

답변

1

나는 문제가 a.resize(last - first + 1);에 있다고 생각 얻는 경우에 정말 감사드립니다. 너는 그렇게해서는 안된다.

first = 6, mid = 7last = 8

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

를 호출하자.

다음 크기를 조정 한 후, a는이 크기 = (8-6 + 1) = 3

그래서 당신이 mid + 1 = 8

+0

첫 번째와 마지막으로 색인을 의미합니다. 예에서 larray는 6에서 7까지의 두 요소를 가지며 rarray는 하나의 요소 만 포함하고 mid == last – skyline09

+0

@ wwlyf52o1314 : 단지 예일 뿐이지 만 요점은 매우 분명합니다. 당신은 분명히'mid '의 큰 값을'merge'라고 부를 것이고,'mid'보다 더 작고 (간단히하기 위해'1 '을 생략했습니다.),'at (mid)'에 접근하려고합니다. 범위를 벗어날 것입니다. 'a.resize'를 주석 처리 한 다음 확인하십시오. –