/******************************************************************************************** * Title: list_sorter.script * Description: This script takes a obj_var_list and then dumps the contents into an array. * the array is then sorted upon Int values of each individual obj_vars in * ascending order. The script then returns the sorted obj_var array. * This script utilizes a qucksort algorithm adapted for use on obj_var arrays. ******************************************************************************************** /***** INCLUDES ********************************************************/ //include anyLibrary; //includes a .scriptlib file /***** INHERITS ********************************************************/ //inherits anyScript; //inherits a .script file /***** CONSTANTS *******************************************************/ //int someConstant; //global constant value /******************************************************************************************** * @brief obtains the information to begin the quick sort * * @param obj_var_list list * * @return obj_var[] sortedArray * *********************************************************************************************/ obj_var[] sortToArray(obj_var_list ovl) { obj_var[] listArray = listToArray(ovl); //dumps the contents of the list into an array int left = 0; int right = listArray.length-1; obj_var[] sortedArray = quickSort(left, right, listArray); return sortedArray; }//sortListToArray() /******************************************************************************************** * @brief recursive quicksort routine that establishes a pivot and partions the items in the array * * @param int left * @param int right * @param obj_var[] listArray * * @return obj_var[] listArray * *********************************************************************************************/ obj_var[] quickSort(int left, int right, obj_var[] listArray) { if(right-left <= 0) // if size <= 1, return listArray; // already sorted else // size is 2 or larger { Object pivot = (listArray[right]).getData(); //set rightmost item as the pivot int partition = 0; boolean validInstance = false; if ( pivot instanceof Integer ) { partition = partitionIntArray(left, right, ((Integer)pivot).intValue(), listArray); validInstance = true; } else if ( pivot instanceof Float ) { partition = partitionFloatArray(left, right, ((Float)pivot).floatValue(), listArray); validInstance = true; } if ( validInstance ) { quickSort(left, partition-1, listArray); // sort left side quickSort(partition+1, right, listArray); // sort right side } } return listArray; }//quickSort /******************************************************************************************** * @brief repartitions the array of obj_vars according to the pivot value * * @param int left * @param int right * @param int pivot * @param obj_var[] listArray * * @return int leftPtr * *********************************************************************************************/ int partitionIntArray(int left, int right, int pivot, obj_var[] listArray) { int leftPtr = left-1; //left (after ++) int rightPtr = right; //right-1 (after --) while(true) //find bigger item { while( (listArray[++leftPtr]).getIntData() < pivot ) ; //(loop) // find smaller item while(rightPtr > 0 && (listArray[--rightPtr]).getIntData() > pivot) ; //(loop) if(leftPtr >= rightPtr) //if pointers cross, break; //partition done else //not crossed, so swap(leftPtr, rightPtr, listArray); //swap elements }//while(true) swap(leftPtr, right, listArray); //restore pivot / return leftPtr; //return pivot location }//partitionIntArray() /******************************************************************************************** * @brief repartitions the array of obj_vars according to the pivot value * * @param int left * @param int right * @param int pivot * @param obj_var[] listArray * * @return int leftPtr * *********************************************************************************************/ int partitionFloatArray(int left, int right, float pivot, obj_var[] listArray) { int leftPtr = left-1; //left (after ++) int rightPtr = right; //right-1 (after --) while(true) //find bigger item { while( (listArray[++leftPtr]).getFloatData() < pivot ) ; //(loop) // find smaller item while(rightPtr > 0 && (listArray[--rightPtr]).getFloatData() > pivot) ; //(loop) if(leftPtr >= rightPtr) //if pointers cross, break; //partition done else //not crossed, so swap(leftPtr, rightPtr, listArray); //swap elements }//while(true) swap(leftPtr, right, listArray); //restore pivot / return leftPtr; //return pivot location }//partitionIt() /******************************************************************************************** * @brief swaps the position of the obj_var in the listArray * * @param int dex1 * @param int dex2 * @param obj_var[] listArray * *********************************************************************************************/ void swap(int dex1, int dex2, obj_var[] listArray) //swap two elements { obj_var temp = listArray[dex1]; //A into temp listArray[dex1] = listArray[dex2]; //B into A listArray[dex2] = temp; //temp into B }//swap() /******************************************************************************************** * @brief dumps the obj_var_list into an array * * @param obj_var_list list * * @return obj_var[] array * *********************************************************************************************/ obj_var[] listToArray(obj_var_list ovl) { int cnt = ovl.getNumItems(); obj_var[] array = new obj_var[cnt]; for(int i=0; i < cnt; ++i) array[i] = ovl.getObjVar(i); return array; }//listToArray() /******************************************************************************************** * @brief dumps the obj_var_list into an array * * @param obj_var_list list * * @return obj_var[] array * *********************************************************************************************/ obj_var_list[] listToListArray(obj_var_list ovl) { int cnt = ovl.getNumItems(); obj_var_list[] array = new obj_var_list[cnt]; for ( int i=0; i < cnt; ++i ) { obj_var ov = ovl.getObjVar(i); if ( !(ov instanceof obj_var_list) ) { return null; } array[i] = (obj_var_list)ov; } return array; }//listToArray()