Il merge ha la stessa complessità asintotica del quick, quindi nn è certo in base alla velocità che il quick è preferibile.
Mergesort ha la sola pecca di non ordinare sul posto (richiede spazio extra) ed è preferibile ad esempio per ordinare liste.
Questo è mergesort (corretto)
codice:void merge(int *array, int l, int m, int r){ int i, j, k, aux[nr]; for (i = m+1; i > l; i--) aux[i-1] = array[i-1]; for (j = m; j < r; j++) aux[r+m-j] = array[j+1]; for (k = l; k <= r; k++) if(aux[i] <= aux[j]) array[k] = aux[i++]; else array[k] = aux[j--]; } void mergesort(int *array, int l, int r){ int m = (r+l)/2; if(r <= l) return; mergesort(array, l, m); mergesort(array, m+1, r); merge(array, l, m, r); }
questo è merge applicato alle liste
codice:#include <stdio.h> #include <stdlib.h> #include <time.h> struct linked{ int value; struct linked *next; } *first = NULL, *new; void add(int); void show(void); struct linked * merge(struct linked *, struct linked *); struct linked *mergesort(struct linked *); void main(){ add(25); show(); first = mergesort(first); show(); } void add(int nr){ srand(time(NULL)); while(nr--){ if(!(new = (struct linked *)malloc(sizeof(struct linked)))) abort(); (*(new)).value = rand()%100; (*(new)).next = NULL; (*(new)).next = first; first = new; } } struct linked * merge(struct linked *a, struct linked *b){ struct linked head; struct linked *node = &head; while((a != NULL) && (b != NULL)) if(a->value <= b->value){ node->next = a; node = a; a = a->next; } else{ node->next = b; node = b; b = b->next; } node->next = (a == NULL) ? b : a; return head.next; } struct linked *mergesort(struct linked *node){ struct linked *a = node; struct linked *b = node->next; if(node == NULL || node->next == NULL) return node; while((b != NULL) && (b->next != NULL)){ node = node->next; b = b->next; } b = node->next; node->next = NULL; return merge(mergesort(a), mergesort(b)); } void show(){ struct linked *temp; for(temp = first; temp->next != NULL; temp = temp->next) printf("%d ", temp->value); printf("\n"); }
Esistono inoltre algoritmi di sorting in grado di ordinare in tempo lineare (radix, counting) ma si applicano solo a casi specifici (quindi quick non è il piu veloce)
edit: ho incollato i codici perche cliccando sui link aggiunge degli spazi bianchi e nn trova le pagine![]()



Rispondi quotando