00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef Sort_h
00021 #define Sort_h
00022
00023 #include "Vec.h"
00024
00025
00026
00027
00028
00029 template<class T>
00030 struct LessThan_default {
00031 bool operator () (T x, T y) { return x < y; }
00032 };
00033
00034
00035 template <class T, class LessThan>
00036 void selectionSort(T* array, int size, LessThan lt)
00037 {
00038 int i, j, best_i;
00039 T tmp;
00040
00041 for (i = 0; i < size-1; i++){
00042 best_i = i;
00043 for (j = i+1; j < size; j++){
00044 if (lt(array[j], array[best_i]))
00045 best_i = j;
00046 }
00047 tmp = array[i]; array[i] = array[best_i]; array[best_i] = tmp;
00048 }
00049 }
00050 template <class T> static inline void selectionSort(T* array, int size) {
00051 selectionSort(array, size, LessThan_default<T>()); }
00052
00053 template <class T, class LessThan>
00054 void sort(T* array, int size, LessThan lt)
00055 {
00056 if (size <= 15)
00057 selectionSort(array, size, lt);
00058
00059 else{
00060 T pivot = array[size / 2];
00061 T tmp;
00062 int i = -1;
00063 int j = size;
00064
00065 for(;;){
00066 do i++; while(lt(array[i], pivot));
00067 do j--; while(lt(pivot, array[j]));
00068
00069 if (i >= j) break;
00070
00071 tmp = array[i]; array[i] = array[j]; array[j] = tmp;
00072 }
00073
00074 sort(array , i , lt);
00075 sort(&array[i], size-i, lt);
00076 }
00077 }
00078 template <class T> static inline void sort(T* array, int size) {
00079 sort(array, size, LessThan_default<T>()); }
00080
00081
00082
00083
00084
00085
00086 template <class T, class LessThan> void sort(vec<T>& v, LessThan lt) {
00087 sort((T*)v, v.size(), lt); }
00088 template <class T> void sort(vec<T>& v) {
00089 sort(v, LessThan_default<T>()); }
00090
00091
00092
00093 #endif