2012-09-24 55 views
0

首先我必須說我是新的算法和c + +。在vim中編寫這段代碼後,當我調試這個C++代碼時,我遇到了error:std:out_of_range,我不知道錯誤在哪裏。所以我在這裏,我非常感謝,如果我得到你的help.thx標準:在mergesort out_of_range

#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

你什麼行錯誤在? –

+0

@LuchianGrigore我編譯這個代碼的gcc沒有錯誤,但是當運行.exe文件時,我被告知錯誤消息。 – skyline09

+2

所以你還沒有真正調試過?投票結束... –

回答

1

我覺得有問題a.resize(last - first + 1);。你不應該這樣做。

假設你叫

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

first = 6mid = 7last = 8

然後調整後,a有大小=(8 - 6 + 1)= 3

因此,這將是problem-

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

+0

第一次也是最後一次意味着索引,在你的例子中,larray有6到7的2個元素,rarray只有一個元素,而中間==最後 – skyline09

+0

@ wwlyf52o1314:我給出的只是一個例子,但重點非常明確。你肯定會爲'mid'的一個大值'merge'調用'last',這個'last - first'可能小於'mid'(爲簡單起見,我省略了'1'),然後試圖訪問'at(mid)將超出範圍。嘗試評論'a.resize'然後檢查。 –