1 #include "util/tag-sorter.h"
4 * Exchange two sort-entries
5 * (should probably be coded inline
8 static void swap(tag_type *a, tag_type *b)
18 * Insertion-Sort algorithm
19 * (used by the Quicksort algorithm)
21 static void insertion_sort(tag_type elements[], int number)
24 for (int i = 1; i < number; i++) {
27 for (j = i; (j > 0) && (elements[j - 1].tag > tmp.tag); j--)
28 elements[j] = elements[j - 1];
34 * Helper function for Quicksort
36 static tag_type median3(tag_type elements[], int left, int right)
38 int center = (left + right) / 2;
40 if (elements[left].tag > elements[center].tag)
41 swap(&elements[left], &elements[center]);
42 if (elements[left].tag > elements[right].tag)
43 swap(&elements[left], &elements[right]);
44 if (elements[center].tag > elements[right].tag)
45 swap(&elements[center], &elements[right]);
47 swap(&elements[center], &elements[right - 1]);
48 return (elements[right - 1]);
54 * The "median of three" pivot selection eliminates
55 * the bad case of already sorted input.
57 * We use insertion_sort for smaller sub-arrays,
58 * because it is faster in this case.
60 * For details see: "Data Structures and Algorithm
61 * Analysis in C" by Mark Allen Weiss.
63 static void quicksort(tag_type elements[], int left, int right)
66 const int array_size_cutoff = 4;
67 if (left + array_size_cutoff <= right) {
68 pivot = median3(elements, left, right);
74 while (elements[++i].tag < pivot.tag)
76 while (elements[--j].tag > pivot.tag)
80 swap(&elements[i], &elements[j]);
85 swap(&elements[i], &elements[right - 1]);
87 quicksort(elements, left, i - 1);
88 quicksort(elements, i + 1, right);
90 insertion_sort(elements + left, right - left + 1);
95 * Frontend for the sorting algorithm
97 * Sorts an array of tagged pointers
98 * with <number> elements.
100 void tag_sort(tag_type elements[], int number) { quicksort(elements, 0, number - 1); }