在阅读了关于这个主题的各种教程和Stackoverflow答案几个小时后,我试图以自己的方式在emu 8086中实现这个算法;虽然我非常接近完成这一点,但在修复了许多错误后,我无法理解我哪里出错了,如果有人能帮助我,我将不胜感激。
select_sort PROC
pusha ; push all register values
mov bp, sp
mov cx, [bp+20] ; transfer no. of integers to cx
mov bx, [bp+18] ; and integer array address to bx
loop_outer:
dec cx
jz done ; if cx=0, done
mov di, cx ; else another iteration
mov dx, SORTED ; assume status of array as sorted
mov si, bx ; transfer array address to si
loop_inner:
mov al, [si]
cmp al, [si+2]
jc resume
mov ah, [si+2]
resume:
add si, 2
dec di
jnz loop_inner
cmp dx, SORTED
je done
jmp swap
swap:
xchg ax, [si+2] ; swap integers at [si] and [si+2]
mov [si], ax
mov dx, UNSORTED ; mark status of array as unsorted
jmp loop_outer
done:
popa ; pop to respective register locations
ret 4
select_sort ENDP
我的输入:534210
输出:53421
预期输出:12345
虽然我认为我的选择排序算法的逻辑是好的,但我不明白为什么我没有得到确切的输出。
1条答案
按热度按时间8ftvxx2r1#
不是选择排序
如果你要交换相邻的元素,那么你就更接近BubbleSort了。SelectionSort的思想是交换距离更远的元素,并从中受益。
为什么不起作用
当你的 loop_inner 找到一个更小的元素时,它应该将状态切换为UNSORTED。
选择排序
下面是一个正确的选择排序,我们找到最小的元素,并把它放在未排序分区的前面。然后我们扩展已排序分区,并缩小未排序分区。
BX
寄存器将一直指向它们之间的分隔。这个过程将数组分为一个增长的已排序分区和一个缩小的未排序分区。我们继续,直到出现'在未排序的分区中只剩下1个元素。以下是排序对示例输入数据的作用(S=已排序,U=未排序):