2012-12-11 65 views
0

我試圖將這兩個排序的數組合並在一起。我知道問題出在程序試圖在達到其大小限制之後比較第一個數組時,但我在計算如何克服這個問題時感到不知所措。任何幫助將非常感激。歐文大會:合併兩個不同大小的陣列

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 
+0

使用調試器單步執行代碼,看看它在哪裏做了一些意想不到的事情。啊沒關係,我看到這不是一個調試問題。儘管如此,我會把它留作一般性建議。 – Jester

+0

我知道問題在於當第一個數組超出數組長度時執行比較時出現問題。我想知道如何設置循環以避免發生這種情況。 – codeslinger

+0

什麼是「Irvine Assembly」? –

回答

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++]; 
} 
相關問題