p1ttypl4tsch
Grünschnabel
Hallo,
für die Uni sollen wir einen Mergesortalgrithmus schreiben, der auf einfach verketteten Listen basiert und höchstens O(log n) zusätzlichen Speicher benötigt.
Das Mergesort an sich ist kein Problem, aber die die Zusatzbedingung, dass nur O(log n) zusätzlicher Speicher verwendet werden darf, ist dann doch schon ein wenig Tricky.
Vllt könnt ihr mir ja helfen.
Mein Code bisher (Visual Studio 2010):
für die Uni sollen wir einen Mergesortalgrithmus schreiben, der auf einfach verketteten Listen basiert und höchstens O(log n) zusätzlichen Speicher benötigt.
Das Mergesort an sich ist kein Problem, aber die die Zusatzbedingung, dass nur O(log n) zusätzlicher Speicher verwendet werden darf, ist dann doch schon ein wenig Tricky.
Vllt könnt ihr mir ja helfen.
Mein Code bisher (Visual Studio 2010):
C:
typedef struct _list{
int elem;
struct _list *next;
}ListRec, *List;
...
List msort(List l){
List slow, fast, right;
slow = l; fast = l->next;
while(fast){ //Split: Wenn "fast" am Ende der Liste ist, ist "slow" in der Mitte
if(fast->next){
fast = fast->next->next;
slow = slow->next;
}else
break;
}
right = slow->next;
slow->next = NULL;
if(l->next){
l = msort(l);
right = msort(right);
}
return merge(l, right);
}
List merge(List left, List right){
List tmp = (List)malloc(sizeof(ListRec));
if(!right && left){
tmp->elem = left->elem;
tmp->next = merge(left->next, right);
return tmp;
}
else if(right && !left){
tmp->elem = right->elem;
tmp->next = merge(left, right->next);
return tmp;
}
if(right && left){
if(left->elem <= right->elem){
tmp->elem = left->elem;
tmp->next = merge(left->next, right);
return tmp;
}else if(left->elem > right->elem){
tmp->elem = right->elem;
tmp->next = merge(left, right->next);
return tmp;
}
}else
return NULL;
}