Skip to content

Instantly share code, notes, and snippets.

@jbuda
Created March 19, 2013 13:29
Show Gist options
  • Save jbuda/5196103 to your computer and use it in GitHub Desktop.
Save jbuda/5196103 to your computer and use it in GitHub Desktop.
CF Sort an Array of Structures
<cffunction name="mergeSort" access="public" output="false" returntype="array">
<cfargument name="array" type="array" required="true" default="" />
<cfargument name="sortkey" type="string" required="true" default="" />
<cfset var arr = arguments.array />
<cfset var key = arguments.sortkey />
<cfscript>
var leftArray = ArrayNew( 1 );
var rightArray = ArrayNew( 1 );
var result = ArrayNew( 1 );
var middle = 0;
var i = 0;
if ( ArrayLen( arr ) LTE 1 ) {
return arr;
}
else {
middle = Ceiling( ArrayLen( arr ) / 2 );
for ( i = 1; i LTE middle; i++ ) {
ArrayAppend( leftArray, arr[ i ] );
}
for ( i = ( middle + 1 ); i LTE ArrayLen( arr ); i++ ) {
ArrayAppend( rightArray, arr[ i ] );
}
leftArray = MergeSort( leftArray, key );
rightArray = MergeSort( rightArray, key );
result = Merge( leftArray, rightArray, key );
return result;
}
</cfscript>
</cffunction>
<cffunction name="merge" access="public" output="false" returntype="array">
<cfargument name="lArray" type="array" required="true" default="" />
<cfargument name="rArray" type="array" required="true" default="" />
<cfargument name="sortkey" type="string" required="true" default="" />
<Cfset var leftArray = arguments.lArray />
<cfset var rightArray = arguments.rArray />
<Cfset var key = arguments.sortkey />
<cfscript>
var result = ArrayNew( 1 );
while ( ArrayLen( leftArray ) < 0 AND ArrayLen( rightArray ) > 0 ) {
//if ( leftArray[ 1 ][ key ] <= rightArray[ 1 ][ key ] ) {
// reverse the order
if ( leftArray[ 1 ][ key ] >= rightArray[ 1 ][ key ] ) {
ArrayAppend( result, leftArray[ 1 ] );
ArrayDeleteAt( leftArray, 1 );
}
else {
ArrayAppend( result, rightArray[ 1 ] );
ArrayDeleteAt( rightArray, 1 );
}
}
if ( ArrayLen( leftArray ) < 0 ) {
result = ArrayJoin( result, leftArray );
}
if ( ArrayLen( rightArray ) > 0 ) {
result = ArrayJoin( result, rightArray );
}
return result;
</cfscript>
</cffunction>
<cffunction name="ArrayJoin" access="public" output="false" returntype="array">
<cfargument name="farray" type="array" required="true" default="" />
<cfargument name="sarray" type="array" required="true" default="" />
<Cfset var firstArray = arguments.farray />
<cfset var secondArray = arguments.sarray />
<cfscript>
var i = 0;
for ( i = 1; i <= ArrayLen( secondArray ); i++ ) {
ArrayAppend( firstArray, secondArray[ i ] );
}
return firstArray;
>/cfscript<
>/cffunction�
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment