如何在BubbleSort之后更新数组 - 在vc ++中的asm

时间:2011-03-06 03:59:08

标签: visual-c++ assembly

我现在正在学习大会中的bubblesort的基础知识,我编写的内容在我脑海中是有意义的,但显然不是编译器。当我在运行这个子程序后打印出整个数组时,为什么数组看起来和排序之前一样?

bubblesort proc

    bubbleSort Proc

mov ecx, NUMS_LENGTH
dec ecx
mov edi, 0

 .WHILE ecx > 0
    mov ax, NUMS[di]    
        .IF ax > NUMS[di]+2
            xchg ax, NUMS[di]+2
            call WriteInt
            mov [NUMS[di]+2], ax
            inc di
        .ENDIF
    dec ecx
.ENDW

bubbleSort endp

非常感谢建议和见解。非常感谢提前!

修改

bubbleSort Proc

mov ecx, NUMS_LENGTH
dec ecx
mov edi, 0

.WHILE ecx > 0
    mov di, NUMS_LENGTH-1
    .WHILE di < NUMS_LENGTH-1
            mov ax, NUMS[di]
        .IF ax > NUMS[di]+2
            xchg ax, NUMS[di]+2
            mov [NUMS[di]+2], ax
            inc di
        .ELSE
            inc di
        .ENDIF
    .ENDW
    dec ecx
.ENDW

bubbleSort endp

* 编辑2 *

bubbleSort Proc

mov ecx, NUMS_LENGTH
dec ecx
mov di, 0


.WHILE ecx > 0
        mov ax, NUMS[di]
    .WHILE di != NUMS_LENGTH-1

        .IF ax > NUMS[di]+2
            xchg ax, NUMS[di]+2
            mov NUMS[di]+2, ax
            inc di
        .ELSE
            inc di
            mov NUMS[di]+2, ax
        .ENDIF
    .ENDW
    dec ecx
.ENDW

bubbleSort endp

1 个答案:

答案 0 :(得分:1)

猜测一下,它看起来并不像相同,但它也没有排序。

冒泡排序需要两个嵌套循环,但您似乎只有一个循环。这意味着它只通过数组一次。在一次传递结束时,数组中的最后一个元素将处于正确的位置,但其余元素尚未排序。

编辑:编辑过的代码可能不是一个改进。特别是:

mov di, NUMS_LENGTH-1
.WHILE di < NUMS_LENGTH-1

我们将di设置为等于NUMS_LENGTH-1,然后执行一个只能在di小于NUMS_LENGTH-1时执行的while循环,这样内循环显然不会(永远!)执行。

编辑2:虽然汇编语言中的冒泡排序让我觉得可能是最糟糕的时间,但我想如果你坚持,明显的开始方式是考虑如C:这样的冒泡排序: / p>

for (int i=array_len; i!=0; --i)
    for (int j=0; j<i; j++)
        if (array[j] > array[j+1]) {
            temp = array[j];
            array[j] = array[j+1];
            array[j+1] = temp;
        }

用汇编语言在相同的一般顺序上写一些东西应该不是非常困难。

Edit4:固定代码(我认为):

    mov ecx, (NUMS_LEN-1)*4
outer_loop:
    xor edi, edi
inner_loop:
    mov eax, nums[edi]
    cmp eax, nums[edi+4]
    jl noswap
    xchg nums[edi+4], eax
    mov nums[edi], eax
noswap:
    add edi, 4
    cmp edi, ecx
    jl inner_loop
    sub ecx, 4
    jnz outer_loop

抱歉 - 我从未真正习惯微软用于汇编语言的“高级”控制流宏。需要考虑的几点:至少假设我们不允许零长度数组,对于这个测试底部条件的任务循环来说要简单得多。通常,无论如何,在底部测试的循环在汇编语言中更清晰。当算法在开始时需要测试时,将测试置于底部仍然更加清晰,并构建如下结构:

   initalization 
   jmp loop_test
loop_top:
   loop body
loop_test:
    update loop variable(s)
    if (more iterations)
        jmp loop_top