2014-02-13 19 views
0

Я создал эту функцию для сортировки слияния данного массивадает странное слияние ответ

#include <iostream> 
using namespace std; 
#include "sorting.h" 



void mergesort_normal(int *A, int p, int r) 
{ 
    if (p < r) { 
     int middle = p + (r - p)/2; 
     mergesort_normal(A, p, middle); 
     mergesort_normal(A, middle +1, r); 
     merge_normal(A, p, middle, r); 
    } 
    } 

void merge_normal (int *A, int p, int mid, int r) 
{ 
    int *helper = new int[r+1]; 
    int h = p; 
    int i = r; 
    int j = mid +1; 
    int k = 0; 


while((h<=mid)&&(j<=r)) 
{ 
    if(A[h]<=A[j]) 
    { 
     helper[i]=A[h]; 
     h++; 
    } 
    else 
    { 
     helper[i]=A[j]; 
     j++; 
    } 
    i++; 
} 
if(h>mid) 
{ 
    for(k=j;k<=r;k++) 
    { 
     helper[i]=A[k]; 
     i++; 
    } 
} 
else 
{ 
    for(k=h;k<=mid;k++) 
    { 
     helper[i]=A[k]; 
     i++; 
    } 
} 
for(k=p;k<=r;k++) 
    A[k]=helper[k]; 
} 


int main() 
{ 
int a[5] = {3,5,6,7,2}; 


mergesort_normal(a,0,4); 

for(int i=0;i<=4;i++) 
cout<<a[i]<<" "<<endl; 

system("PAUSE"); 
cout<<endl<<endl<<endl<<endl; 
return 0; 

} 

Я получаю результат:

-842150451 
-842150451 
-842150451 
-842150451 
-842150451 

Любую идею о том, почему это происходит? Кроме того, как я могу превратить это в битоновское объединение? Любая помощь будет принята с благодарностью!

+0

Что-то не инициализируется. Кроме того, не делайте '... i <= 4; ...' do '...; i <5; ... ' – BWG

+0

Любая идея о том, что это может быть? Я прошел через это сто раз и не могу найти его – user2796815

ответ

1
int *helper = new int[r+1]; 
int i = r; 
helper[i]=A[h]; 
i++; 

Первая итерация этого (с i == r) является первым и последним, что на самом деле остается в пределах границ helper. После этого вы бодро забудете буфер.

Только последний элемент helper (и куча случайной памяти мимо него) когда-либо назначается; остальное остается неинициализированным.

+0

Удивительный! Огромное спасибо. Это исправило это. – user2796815

Смежные вопросы