#ifndef SORT_HH #define SORT_HH #ifndef QUICKSORT_CUT_OFF // defines where quick sort stops and #define QUICKSORT_CUTOFF 10 // Insertion Sort takes over. #endif #define MAX_TIME 25 // #define MAX_ELEMS 25 #include #include #include "BasicEvent.hh" void swap(BasicEvent*& a,BasicEvent*& b) { BasicEvent* temp = a; a = b; b = temp; }; // Shuffles the elements in the array such that, all elements <= elem // lies before elem. int partition(BasicEvent* inpArray[], int numElem) { BasicEvent* part = inpArray[0]; int i,j; i = -1; j = numElem; while(irecvTime < inpArray[j]->recvTime); do i++; while(inpArray[i]->recvTime < part->recvTime); if(i < j) swap(inpArray[i],inpArray[j]); } return j+1; }; // Prepares the array for Partition by the partiton algorithm void medianOfThree(BasicEvent *inpArray[], int numElem) { if (numElem >= 3) { BasicEvent* begin = inpArray[0]; BasicEvent* middle = inpArray[numElem/2]; BasicEvent* end = inpArray[numElem -1]; if(begin->recvTime < middle->recvTime) { if(middle->recvTime < end->recvTime) swap(begin,middle); // middle is the median else if(begin->recvTime < end->recvTime) swap(begin,end); // end is the median } else { if(middle->recvTime < end->recvTime) { if(begin->recvTime >= end->recvTime) swap(begin,end); } else swap(begin,middle); } } }; // Used by Quick sort to sort the array int qSortHelper(BasicEvent* inpArray[], int numElem) { int left = 0; while(numElem > 1) { medianOfThree(inpArray+left,numElem); int part = partition(inpArray+left,numElem); qSortHelper(inpArray+left,part); left += part; numElem -= part; } }; void insertionSort(BasicEvent* inpArray[],int numElem) { int i,j; for(i=1;irecvTime < inpArray[i-1]->recvTime) { BasicEvent* temp = inpArray[i]; for(j=i;j && temp->recvTimerecvTime;j--) inpArray[j] = inpArray[j-1]; inpArray[j] = temp; } } }; // Sorts the array inpArray with numElem elements using Quck sort // Or insertion sort (if the array is small) // Assume the elements in InpArray are BasicEvents // Returns an array of sorted BasicEvents void sortArray(BasicEvent* inpArray[],int numElem) { if(numElem > QUICKSORT_CUTOFF) qSortHelper(inpArray,numElem); else insertionSort(inpArray,numElem); }; void createArray(BasicEvent *array[],int arrayLen) { int i; srand(MAX_TIME); for(i=0;irecvTime = rand(); } }; void printArray(BasicEvent* array[],int arrayLen) { int i; for(i=0;i