2012-09-24 2 views
0

d'abord je dois dire que je suis nouveau dans l'algorithme et C++. Après avoir écrit ce code dans vim et quand je débogue ce code C++, j'ai rencontré le error:std:out_of_range et je n'ai aucune idée d'où est l'erreur. donc je suis ici, et je suis très reconnaissant si je reçois votre help.thxstd: out_of_range dans 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

Quelle ligne obtenez-vous l'erreur à? –

+0

@LuchianGrigore je compiler ce code par gcc sans erreur, mais lors de l'exécution du fichier .exe je suis dit le message d'erreur. – skyline09

+2

Donc, vous n'avez pas réellement débogué? Voter pour fermer ... –

Répondre

1

Je pense qu'il ya un problème a.resize(last - first + 1);. Tu ne devrais pas faire ça.

Supposons que vous appelez

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

avec first = 6, mid = 7 et last = 8.

puis après le redimensionnement, a a une taille = (8 - 6 + 1) = 3.

Donc cela va être

de problèmes

rarray.at(i) = a.at(mid + 1 + i); vous voyez mid + 1 = 8

+0

premier et dernier signifie l'index, dans votre exemple, le larray a les 2 éléments de 6 à 7, le rarray n'a qu'un élément, et le milieu == dernier – skyline09

+0

@ wwlyf52o1314: Ce que j'ai donné est seulement un exemple, mais le point est très clair. Vous appellerez certainement 'merge' pour une grande valeur de' mid', qui peut avoir 'last - first' plus petit que' mid' (j'ai omis '1' pour plus de simplicité), puis j'essaie d 'accéder' at (mid) ' va être hors de portée. Essayez de commenter 'a.resize', puis vérifiez. –