/* * * Copyright (c) 1994 * Hewlett-Packard Company * */ #ifndef INSERTION_SORT_H #define INSERTION_SORT_H #include "assert.H" #include "utilities.H" #include "binary.H" template inline Iterator unguardedLinearInsert(Iterator last, T value) { while (value - *(last - 1) < 0) { *last = *(last - 1); last--; } *last = value; return last; } template inline Iterator unguardedLinearInsert(Iterator last, T value, Compare comp) { while (comp(value , *(last - 1)) < 0) { *last = *(last - 1); last--; } *last = value; return last; } template Iterator linearInsert(Iterator first, Iterator last, T value) { ASSERT(first != last); if (value - *first >= 0) return unguardedLinearInsert(last, value); moveBackward(first, last, last + 1); *first = value; return first; } template Iterator linearInsert(Iterator first, Iterator last, T value, Compare comp) { ASSERT(first != last); if (comp(value, *first) >= 0) return unguardedLinearInsert(last, value, comp); moveBackward(first, last, last + 1); *first = value; return first; } template Iterator binaryInsert(Iterator first, Iterator last, T value) { ASSERT(first != last); Iterator cut = binaryNotGreater(first, last, value); moveBackward(cut, last, last + 1); *cut = value; return cut; } template Iterator binaryInsert(Iterator first, Iterator last, T value, Compare comp) { ASSERT(first != last); Iterator cut = binaryNotGreater(first, last, value, comp); moveBackward(cut, last, last + 1); *cut = value; return cut; } template void unguardedInsertionSort(Iterator first, Iterator last) { if (first == last) return; for (Iterator i = first; i != last; i++) (void)unguardedLinearInsert(i, *i); } template void unguardedInsertionSort(Iterator first, Iterator last, Compare comp) { if (first == last) return; for (Iterator i = first; i != last; i++) (void)unguardedLinearInsert(i, *i, comp); } template void insertionSort(Iterator first, Iterator last) { if ((first == last) || (first + 1 == last)) return; for (Iterator i = first + 1; i != last; i++) (void)linearInsert(first, i, *i); } template void insertionSort(Iterator first, Iterator last, Compare comp) { if ((first == last) || (first + 1 == last)) return; for (Iterator i = first + 1; i != last; i++) (void)linearInsert(first, i, *i, comp); } template void binaryInsertionSort(Iterator first, Iterator last) { if ((first == last) || (first + 1 == last)) return; for (Iterator i = first + 1; i != last; i++) (void)binaryInsert(first, i, *i); } template void binaryInsertionSort(Iterator first, Iterator last, Compare comp) { if ((first == last) || (first + 1 == last)) return; for (Iterator i = first + 1; i != last; i++) (void)binaryInsert(first, i, comp, *i); } #endif