【发布时间】:2010-06-29 22:35:20
【问题描述】:
我正在尝试在 Coldfusion 中实现归并排序,但结果不正确,代码:
<cffunction name="mergeSort" hint="Sorts arrays of structs">
<cfargument name="arr" type="Array" required="yes">
<cfif Arraylen(arr) LTE 1>
<cfreturn arr />
</cfif>
<cfset left_ = ArrayNew(1)>
<cfset right_ = ArrayNew(1)>
<cfset mid_ = Int(Arraylen(arr) / 2)>
<cfloop index="i" from="1" to="#mid_#">
<cfset arrayAppend(left_, arr[i])>
</cfloop>
<cfloop index="j" from="#mid_+1#" to="#ArrayLen(arr)#">
<cfset arrayAppend(right_, arr[j])>
</cfloop>
<cfreturn merge( mergeSort(left_), mergeSort(right_) )>
</cffunction>
<cffunction name="merge" hint="Merges two arrays">
<cfargument name="left_" required="yes" type="Array">
<cfargument name="right_" required="yes" type="Array">
<cfset result = ArrayNew(1)>
<cfloop condition="ArrayLen(left_) GT 0 AND ArrayLen(right_) GT 0">
<cfif left_[1].attr3 LTE right_[1].attr3>
<cfset arrayAppend(result, left_[1])>
<cfset arrayDeleteAt(left_, 1)>
<cfelse>
<cfset arrayAppend(result, right_[1])>
<cfset arrayDeleteAt(right_, 1)>
</cfif>
</cfloop>
<cfif ArrayLen(left_) GT 0>
<cfloop array="#left_#" index="v">
<cfset ArrayAppend(result, v)>
</cfloop>
</cfif>
<cfif ArrayLen(right_) GT 0>
<cfloop array="#right_#" index="v">
<cfset ArrayAppend(result, v)>
</cfloop>
</cfif>
<cfreturn result />
</cffunction>
它在名为“attr3”的结构键上对结构数组进行排序。发生的事情是它似乎正确地拆分了列表,但随后继续将相同的列表附加到结果集中。因此,例如,如果我将 left_.attr3 设置为“Title”,将 right_.attr3 设置为“Another”,则结果最终会是“Title”、“Another”、“Another”、“Another”……等等。
【问题讨论】:
-
顺便说一句,请 var 作用域所有变量!
-
求助。 Var 定义变量的范围解决了这个问题。我想这就是我因不正确的编码实践而得到的。谢谢亨利。
-
你应该回复,这样我就可以选择你的答案是正确的:)
-
@Svante 你可以很容易地用coldfusion脚本重写上面的内容。您不必使用标签语法。
标签: algorithm coldfusion mergesort