2013-01-27 1 views
0

Я хочу отсортировать массив. SO я написал эту сортировку слияния, она не делает то, что я хочу, чтобы i.e сортировать, просто киоски! Я перехожу по алгоритму снова и снова, и я чувствую, что это так правильно, но нет! , пожалуйста, взгляните и скажите мне, что может быть неправильным.В этом объединении есть что-то неправильное

void mergeSort(int *arr, int low, int high){ 
int mid = (low+high)/2; 
while(low<high){ 
    mergeSort(arr, low, mid); 
    mergeSort(arr, mid+1, high); 
    merge(arr, low, high, mid); 
} 
} 

void merge(int *arr,int low, int high, int mid){ 
int i =low,j=mid+1,k=0; 
int temp[50]; // should i new/malloc this with size of (high -low +1) ? 
while(i<=mid && j<=high){ 
    if(arr[i]<arr[j]) 
     temp[k++] = arr[i++]; 
    else 
     temp[k++] = arr[j++]; 
} 
while(i<=mid) 
    temp[k++] = arr[i++]; 
while(j<=high) 
    temp[k++] = arr[j++]; 
for(int x = 0; x<=high; x++){ 
    arr[x]=temp[x]; 
} 
} 
+3

Просить людей обнаружить ошибки в коде неэффективно. Вы должны использовать отладчик (или добавить заявления печати), чтобы изолировать проблему, а затем построить [минимальный тестовый сценарий] (http://sscce.org). –

+2

'while (низкий <высокий) {' <- когда вы ожидаете завершения цикла? –

+0

u сейчас, ** debug ** it –

ответ

3
void mergeSort(int *arr, int low, int high){ 
    int mid = (low+high)/2; 
    while(low<high){ 

, если петля вводится на всех, это бесконечный цикл, так как ни low, ни high меняются.

 mergeSort(arr, low, mid); 
     mergeSort(arr, mid+1, high); 
     merge(arr, low, high, mid); 
    } 
} 

void merge(int *arr,int low, int high, int mid){ 
    int i =low,j=mid+1,k=0; 
    int temp[50]; // should i new/malloc this with size of (high -low +1) ? 

Да, вы должны определенно выделить правильную сумму хранения.

while(i<=mid && j<=high){ 
     if(arr[i]<arr[j]) 

Это должно быть лучше arr[i] <= arr[j] иметь стабильный вид, хотя это не имеет значения для int с.

  temp[k++] = arr[i++]; 
     else 
      temp[k++] = arr[j++]; 
    } 
    while(i<=mid) 
     temp[k++] = arr[i++]; 
    while(j<=high) 
     temp[k++] = arr[j++]; 
    for(int x = 0; x<=high; x++){ 

Это должно быть for(int x = low; ....

 arr[x]=temp[x]; 

arr[x] = temp[x-low]; (или использовать два индекса).

} 
} 
+1

Большинство ошибок пятнисто. Один пропустил: в последнем цикле индексы в arr и temp не совпадают (один начинается с низкого, другие начинается с 0) – JoergB

+0

А, спасибо. Пропущенный индекс 'temp' должен начинаться с 0. –

+0

эй спасибо, позаботился о бесконечном цикле, который использовался if() вместо времени. –

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