Files
dsrc/sku.0/sys.server/compiled/game/script/library/list.scriptlib
T

221 lines
6.9 KiB
Plaintext

/********************************************************************************************
* 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()