Что не так с этим слиянием? - PullRequest
1 голос
/ 30 июня 2010

Я пытаюсь внедрить сортировку слиянием в 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 как «Заголовок» и right_.attr3 как «Другой», результатом будет «Заголовок», «Другой», «Другой», «Другой» ... и т. Д. *

1 Ответ

4 голосов
/ 30 июня 2010

Вы смотрели на Как отсортировать массив структур в ColdFusion ?

Кстати, PLS Var области видимости все ваши переменные!

Кстати, вы можете объединить массивы с Java Присоединиться к двум массивам в ColdFusion

кстати, вы можете использовать mid_ = Arraylen(arr) \ 2 для целого числа div

...