2010-11-24 66 views
-1

我有以下爲自下而上代碼歸併它確實是對文件的操作間通過-M合併每個雙打米通這裏是代碼自下而上歸併

#include <iostream> 
#include <vector> 
using namespace std; 

inline int Min(int a,int b) 
{ 
    return a<b?a:b; 
} 

void merge(int a[],int l,int m,int r) 
{ 
    vector<int>b; 
    int i, j; 
    for (i=m+1;i>=l;i--) b[i-1]=a[i-1]; 
    for (j=m;j<r;j++) b[r+m-j]=a[j+1]; 
    for (int k=l;k<=r;k++) 
     if (b[j]<b[i]) 
      a[k]=b[j--]; 
     else 
      a[k]=b[i++]; 
} 

void mergesort(int a[],int l,int r) 
{ 
    for (int m=1;m<=r-l;m=m+m) 
     for (int i=l;i<=r-m;i+=m+m) 
      merge(a,i,i+m-1,Min(i+m+m-1,r)); 
} 

int main() 
{ 
    int a[]={12,4,7,3,9,8,10,11,6}; 
    int n=sizeof(a)/sizeof(int); 
    mergesort(a,0,n-1); 
    for (int i=0;i<n;i++) 
    { 
     cout<<a[i]<< " "; 
    } 

    return 0; 
} 

但是當我運行這段代碼有例外其中說,向量的超出範圍錯誤發生請幫助

+0

異常來自哪條線?你試圖訪問什麼元素,你相信這個媒介有多大?你那個時候的調用堆棧有多深?索引是否超出範圍,i,j或k? 老實說,@ user466441,你的大部分問題都是「這是一堆代碼,請幫助」,沒有任何信息或你的努力。 – abelenky 2010-11-24 17:23:22

+0

我重新格式化了你的代碼。但是,更一致的格式仍然不能解決您的不良變量名稱,括號和單行語句的不一致使用。 – abelenky 2010-11-24 17:27:30

回答

1

您創建b作爲一個空向量,然後開始尋址其元素。它的大小爲0,所以這是無效的。你應該給它更大的尺寸。

2

您尚未初始化您的矢量以獲取其中的任何數據。

我想這是一個練習,這就是爲什麼你重新發明輪子。我不確定這是否是使用單字符標識符的理由,這會使您的代碼難以理解。

如果是一個數組,l是其長度,你可以初始化b相

vector<int> b(a, a+l); 

想必你創建你的數組排序的目的的臨時副本。

是不是合併遞歸,順便說一下?我沒有看到你的存在。

我的代碼也存在其他問題,例如縮進表明for循環是嵌套的,但與for語句位於同一行的語句後面的分號表示否則會提示。我建議你總是在循環中使用大括號。

2

功能merge您有vector<int>b; b在這裏的大小爲0。你應該rezise()您的載體,或用數組初始化:

vector<int> v(arr, arr+size); 
1

其他人,試圖索引元素的空載體解決您的問題。此外,下面的循環中存在一個問題:

for (i=m+1;i>=l;i--) b[i-1]=a[i-1]; 

通過循環的最後迭代有i=l和你解決矢量/陣列的[i-1]元件。當l=0這是索引-1,並將向量和陣列超出範圍。