2016-12-13 4 views
1

Я пытаюсь реализовать сортировку слияния. Мой код работаетОпределение размера бокового массива в сортировке слиянием

void merge(int * , int , int , int ); 

void mergeSort(int *arr , int low , int high){ 

    if(low < high){ 
     int mid = (low + high)/2; 
     mergeSort(arr , 0 , mid); 
     mergeSort(arr , mid +1, high); 
     merge(arr , low , mid , high); 
    } 
} 

void merge(int *arr , int low , int mid , int high){ 


    int barr[ high ]; 
    int i  = low; 
    int j  = mid + 1; 
    int index = low; 
    while(i <= mid && j <= high){ 
     if(arr[i] < arr[j]){ 
      barr[index++] = arr[i++]; 
     } 
     else{ 
      barr[index++] = arr[j++]; 
     } 
    } 
    if(i < mid + 1) 
     for(int x = i ; x < mid +1 ; x++) 
      barr[ index++ ] = arr[x]; 

    if(j <= high) 
     for(int y = j ; y < high ; y ++) 
      barr[ index++ ] = arr[y]; 
    for(int z = low ; z < index ; z++){ 
     arr[z] = barr[z]; 
    } 
} 

int main() 
{ 
    int arr[] = { 5 ,6 , 2, 6 ,7 , 5 ,8 ,9}; 
    mergeSort(arr , 0 , 8); 
    for(int i = 0; i < 8 ; i++){ 
     cout << arr[i] << " "; 
    } 
    return 0; 
} 

Что я имею трудное время, чтобы решить, как эта линия

int barr[high]; 

Как я могу решить, эффективный размер этой стороне массива? Я думал, что high-low будет достаточно, но при этом его не будет, bcs, когда я создам arary размером 1, я получаю доступ к элементам по более крупному индексу. Есть ли способ, как решить это, или я должен всегда создавать массив высоких элементов, что приведет к большому потреблению памяти = мой код не эффективен.

Благодаря

+0

Возможно, вам стоит переместить это на [codereview.se]. –

+0

Посмотрите, как они это делают: http://quiz.geeksforgeeks.org/merge-sort/ – NathanOliver

+0

Замечание VLA недействительно C++ code – Slava

ответ

0

Как было отмечено в комментариях, VLAs aren't valid in C++. Что касается вашего вопроса, если вы хотите объединить часть массива с индексами от low до high, вам необходимо точно указать размер массива high - low + 1.

+0

это вызывает ошибку seg – Johnyb

+0

@Johnyb, потому что у вас есть 'while (i <= mid && j <= высокий)' вместо 'while (i <= mid && j <высокий) ' –

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