2010-06-29 25 views
1

我试图实现ColdFusion的归并,但随地吐痰不正确的结果,代码:这个mergesort有什么问题?

<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设置为“标题”,将right_.attr3设置为“Another”,则结果为“标题”,“另一个”,“另一个”,“另一个”..等。

+1

顺便说一句,请VAR范围内的所有的变量! – Henry 2010-06-29 22:46:38

+0

Welp。 Var范围确定变量的问题。我想这就是我不适当的编码做法。谢谢亨利。 – dhorn 2010-06-29 22:58:13

+0

你应该回复,所以我可以选择你的答案是正确的:) – dhorn 2010-06-29 22:58:30

回答