initial
[prop.git] / include / AD / sort / insort.h
blob435db0d6e5b1fd8212eb7614a2e4d8d91d97d44b
1 //////////////////////////////////////////////////////////////////////////////
2 // NOTICE:
3 //
4 // ADLib, Prop and their related set of tools and documentation are in the
5 // public domain. The author(s) of this software reserve no copyrights on
6 // the source code and any code generated using the tools. You are encouraged
7 // to use ADLib and Prop to develop software, in both academic and commercial
8 // settings, and are free to incorporate any part of ADLib and Prop into
9 // your programs.
11 // Although you are under no obligation to do so, we strongly recommend that
12 // you give away all software developed using our tools.
14 // We also ask that credit be given to us when ADLib and/or Prop are used in
15 // your programs, and that this notice be preserved intact in all the source
16 // code.
18 // This software is still under development and we welcome any suggestions
19 // and help from the users.
21 // Allen Leung
22 // 1994
23 //////////////////////////////////////////////////////////////////////////////
25 #ifndef insertion_sort_h
26 #define insertion_sort_h
28 #include <AD/sort/sorting.h>
31 // Insertion sort
32 //
33 // e.g. insertionSort(char *, names, 100, strcmp(key,names[i]) < 0);
36 ///////////////////////////////////////////////////////////////////////////
37 // Macro version
38 ///////////////////////////////////////////////////////////////////////////
39 #define insertionSort(TYPE,A,N,predicate) \
40 do { \
41 for (register int j = 1; j < (N); j++) { \
42 register TYPE key = (A)[j]; \
43 register int i; \
44 for (i = j - 1; i >= 0; i--) { \
45 if (! (predicate)) break; \
46 (A)[i+1] = (A)[i]; \
47 } \
48 (A)[i+1] = key; \
49 } \
50 } while(0)
52 ///////////////////////////////////////////////////////////////////////////
53 // Template version
54 ///////////////////////////////////////////////////////////////////////////
55 template <class T, class Ord>
56 class InsertionSort : public Sorting<T,Ord> {
57 public:
58 void sort(int, T []);
61 template <class T, class Ord>
62 void InsertionSort<T,Ord>::sort(int N, T array[])
63 { insertionSort(T, array, N, Ord::less(key, array[i])); }
65 #endif