我现在正在学习大会中的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
答案 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