Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int Length(list* h)
- {
- int count = 0;
- list* current = h;
- while (current != NULL)
- {
- count++;
- current = current->next;
- }
- return(count);
- }
- void FrontBackSplit(list* source, list** frontRef, list** backRef)
- {
- int len = Length(source);
- int i;
- list* current = source;
- if (len < 2)
- {
- *frontRef = source;
- *backRef = NULL;
- }
- else
- {
- int hopCount = (len-1)/2;
- for (i = 0; i<hopCount; i++)
- {
- current = current->next;
- }
- // исходный список разбивается на два подсписка
- *frontRef = source;
- *backRef = current->next;
- current->next = NULL;
- }
- }
- list* SortedMerge_Name(list* a, list* b)
- {
- list* result = NULL;
- if (a==NULL) return(b);
- else if (b==NULL) return(a);
- if (strcmp(a->info.name,b->info.name)<0)
- {
- result = a;
- result->next = SortedMerge_Name(a->next, b);
- }
- else
- {
- result = b;
- result->next = SortedMerge_Name(a, b->next);
- }
- return(result);
- }
- void MergeSort_Name(list** hRef)
- {
- list* h = *hRef;
- list* a;
- list* b;
- // вырожденный случай – длина списка равно 0 или 1
- if ((h == NULL) || (h->next == NULL))
- {
- return;
- }
- FrontBackSplit(h, &a, &b);
- MergeSort_Name(&a); // рекурсивная сортировка подсписков
- MergeSort_Name(&b);
- *hRef = SortedMerge_Name(a, b);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement