mirror of
https://github.com/SWG-Source/dsrc.git
synced 2026-07-29 23:15:55 -04:00
227 lines
7.2 KiB
Plaintext
227 lines
7.2 KiB
Plaintext
/********************************************************************************************
|
|
* Copyright (c) ©2000,2001 Sony Online Entertainment Inc.
|
|
* All Rights Reserved
|
|
********************************************************************************************
|
|
* 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.
|
|
*
|
|
* @author $Author: Matthew Kwid$
|
|
* @version $Revision: $
|
|
********************************************************************************************
|
|
|
|
/***** 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()
|
|
|
|
|
|
|