0

これらの 2 つの並べ替えられた配列を一緒にマージしようとしています。プログラムがサイズ制限に達した後に最初の配列を比較しようとしているときに問題があることはわかっていますが、これを乗り越える方法がわかりません。どんな助けでも本当に感謝しています。

include irvine32.inc
Title ArrayMerge

.data
a1  dw 1,3,4,7,9,15,17
a2  dw 2,6,8,10,11,14,18,19
a3  dw 15 dup(0)

.code
main proc
    sub     EAX,EAX
    mov     ESI,OFFSET a1
    mov     EDI,OFFSET a2
    mov     EDX,OFFSET a3

    call    Merge
    call    Display
    exit
main endp

;=====================================================================
Merge proc
    mov     ECX,lengthof a3 ;Set loop times
TheLoop:
TheJump:
    mov     ax,[ESI]
    cmp     ax,[EDI]
    jl      AddA1  ;Jump if less
    jg      AddA2  ;Jump if greater
    Loop    TheLoop
    jmp     EndJump
AddA1:
    mov     ax,[ESI]
    mov     [EDX],ax
    add     ESI,2
    add     EDX,2
    jmp     TheJump

AddA2:
    mov     ax,[EDI]
    mov     [EDX],ax
    add     EDI,2
    add     EDX,2
    jmp     TheJump

EndJump:
    ret
Merge endp
;==================================================================
Display proc
    mov     ECX,lengthof a3 ;Set loop times
    mov     EDX,offset a3

DisplayLoop:
    mov     ax,[EDX]
    add     EDX,2
    call    writedec
    call    crlf
    loop    DisplayLoop
    ret
Display endp
;===================================================================
end main
4

1 に答える 1

1

各配列から処理した要素の数について、個別のカウンターを維持する必要があります。いずれかの終わりに到達したら、残りの要素をもう一方からコピーするだけです。また、要素が等しい場合はコピーしませんが、コピーする必要があることに注意してください。

i = j = k = 0;
while(i < length1 && j < length2)
{
    switch(compare(src1[i], src2[j]))
    {
        case -1: // src1 is less, copy it
            dst[k++] = src1[i++];
            break;
        case 0:  // equal, copy src2 but also increment i
            i++;
            // fall-through
        case 1:  // src2 is less, copy it
            dst[k++] = src2[j++];
    }
}
// at this point we have reached the end of one of the arrays
// just copy remaining elements
// note only one of these loops will do anything
while(i < length1)
{
    dst[k++] = src1[i++];
}
while(j < length2)
{
    dst[k++] = src2[j++];
}
于 2012-12-11T01:54:05.147 に答える