2015-11-13 3 views
0

Bonjour, Stack Overflow. Vous m'avez aidé lors d'une mission précédente, et j'espère avoir un peu d'aide sur celui-ci.Broken Merge Trier

Il s'agit d'une affectation de programmation relative aux tris, dont une partie consiste à écrire une implémentation de travail de tri par fusion.

J'ai adapté ma solution à partir du pseudo-code utilisé par le professeur en classe, mais j'obtiens une erreur de segmentation gênante à l'endroit indiqué.

Cette méthode consiste à trier un tableau de structures, avec data_t défini en tant que pointeurs de structure.

La définition struct:

typedef struct { 
int id; 
int salary; 
} employee_t; 

typedef employee_t* data_t; 

Ils sont classés par le salaire, ce qui est un nombre aléatoire de 40 000 à 90 000.

est ici la méthode réelle

void merge_sort(data_t items[], size_t n) 
{ 
if (n < 2) 
    return; 

size_t mid = (n/2); 

data_t *left = malloc(sizeof(data_t) * mid); 
data_t *right = malloc(sizeof(data_t) * (n - mid)); 

for (int y = 0; y < mid; y++) 
{ 
    left[y] = items[y]; 
} 

for (int z = mid; z < n; z++) 
{ 
    right[z] = items[z]; 
} 

merge_sort(left, mid); 
merge_sort(right, (n - mid)); 

size_t l, r, i; 
l = 0; 
r = 0; 

for (i = 0; i < (n - 1); i++) 
{ 
    if ((l < mid) && ((r >= (n - mid)) || ((left[l]->salary) <= (right[r]->salary)))) 
    { 
    items[i] = left[l++]; 
    } 
    else 
    { 
    items[i] = right[r++]; 
    } 
} 

free(left); 
free(right); 
} 

Note que je ne l'ai pas fait jusqu'à la fin, de sorte que les Libère du tableau pourrait être mal situé. La segfault se produit toujours lorsque j'essaie d'accéder à droite [r] -> salary, donc je suppose que c'est lié à un pointeur nul, ou similaire. Cependant, je suis extrêmement novice dans le domaine du tri, et je ne sais pas exactement où implanter correctement un chèque.

Tout conseil est grandement apprécié.

+0

Utilisez un débogueur. – usr1234567

+0

Comptez vos parenthèses. – Beta

Répondre

1

À première vue, il y a ce correctif:

for (int z = mid; z < n; z++) 
    { 
     right[z-mid] = items[z]; 
    } 
+0

... wow. Cela a réellement fonctionné. Quelqu'un peut-il expliquer pourquoi? Il est 4 heures du matin, et mon cerveau ne fonctionne pas très bien. – ZeroKelvin

+1

Les index pour right [] vont de 0 à n-mid-1. Comme z commence au milieu, vous devez soustraire mid de z avant de l'utiliser comme index vers la droite []. – rcgldr

+0

Merci. Cela aura plus de sens après que je dorme. – ZeroKelvin