2017-08-26 122 views
-3

我寫了一個歸併排序算法中的,但跟隨在編譯它,我得到如下,其中規定 表達:向量下標越界無法理解錯誤

我不明白爲什麼我收到此錯誤, PLZ指出了錯誤,我已經基於我對mergesort算法的理解編碼了這個算法

根據我的理解,我編寫了一個遞歸函數(mergesort),其中每次所討論的數組分爲兩部分即左,右,然後將左右數組進一步細分,直到只有1個元素p的點一旦這個階段到達,就會在子數組中重新發送合併函數,以便對分區數組進行排序並將其合併到從中進行數組分割的原始數組中,並且遞歸在遞歸樹中向後退一步

這裏是源代碼代碼

#include<iostream> 
#include<vector> 
using namespace std; 
class Soham 
{ 
    vector<int> v; 
public: 
    Soham(); 
    void merge(vector<int> &, vector<int> & ,vector<int> &); 
    void mergesort(vector<int> &); 
}; 
Soham::Soham() 
{ 
    int no; 
    for (int i = 0; i < 5; i++) 
    { 
     cin >> no; 
     v.push_back(no); 
    } 
    mergesort(v); 
    cout << "result" << endl; 
    for (auto it = v.begin(); it != v.end(); it++) 
     cout << *it << " "; 
} 
void Soham::mergesort(vector<int> &v) 
{ 
    if (v.size() < 2) 
     return; 
    else 
    { 
     vector<int>left, right; 
     if (v.size() % 2 == 0)//if input size is even 
     { 
      auto it = v.begin() + (v.size()/2); 
      left.assign(v.begin(),it); 
      right.assign(it, v.end()); 
     } 
     else// if input size is odd 
     { 
      auto it = v.begin() + (v.size()/2); 
      left.assign(v.begin(),next(it)); 
      right.assign(next(it), v.end()); 
     } 
     mergesort(left); 
     mergesort(right); 
     merge(left, right,v); 
    } 
} 
void Soham::merge(vector<int> &temp_left, vector<int> &temp_right,vector<int> &temp_main) 
{ 
    int i = 0, j = 0, k = 0; 
    while (i<= temp_left.size() && j <= temp_right.size()) 
    { 
     if (temp_left[i] <= temp_right[j]) 
     { 
      temp_main[k] = temp_left[i]; 
      i++; 
      k++; 
     } 
     else 
     { 
      temp_main[k]=temp_right[j]; 
      j++; 
      k++; 
     } 
    } 
    while (i <= temp_left.size()) 
    { 
     temp_main[k]=temp_left[i]; 
     i++; 
     k++; 
    } 
    while (j <= temp_right.size()) 
    { 
     temp_main[k]=temp_right[j]; 
     j++; 
     k++; 
    } 
} 
int main() 
{ 
    Soham a; 
    system("pause"); 
    return 0; 
} 

感謝您的幫助

+1

請[編輯]您的問題以提供[mcve]。 –

+1

請在*問題,*逐字*和作爲文本 - *不*鏈接或作爲圖像後面的任何錯誤信息*。 –

+0

如何按下重試並打開調試器以查看發生了界外訪問的位置? –

回答

0
while (i <= temp_left.size()) 

當你在索引大小(訪問向量),你會得到你出界外接入

+0

非常感謝先生 – jack121

+0

請注意,您可以使用at()而不是[],因此它會在不正確的索引temp_main.at(k )= temp_left.at(i) –