我正在尝试在汇编中实现快速排序。 当停止条件为真时我无法实现return语句,因为我可以用C#或任何其他高级语言来实现。 帮助将不胜感激!
这是我的代码:
INCLUDE Irvine32.inc
Len EQU 8
.data
Numbers byte 5,6,4,7,11,2,9,1
Sorted byte Len dup(?)
Index_Pivot dword ?
Element_Pivot byte ?
Greater byte Len dup(-1)
Less byte Len dup(-1)
Temp dword ?
Temp2 dword ?
.code
Generate_Random PROC
Mov eax,ebx
CALL randomrange
ret
Generate_Random ENDP
;-----------------------------
Quick_Sort PROC
CMP ebx,1
JLE Next
CALL Generate_Random
MOV Index_Pivot,eax
ADD esi,eax
MOV Temp2,eax
MOV al,[esi]
MOV Element_Pivot,al
MOV byte ptr[esi],' '
SUB esi,Temp2
;-------------------------
MOV ecx,ebx
JMP Do_calc
Continue::
MOV Temp,edx
MOV esi,OFFSET Less
MOV ebx,Temp
CALL Quick_Sort
Next:
ret
Quick_Sort ENDP
;-------------------------------------
Do_calc:
MOV ebx,0
MOV edx,0
;MOV ecx,Len
L:
MOV al,Element_Pivot
CMP byte ptr[esi],' '
JE Next
CMP [esi],al
JG Move_Greater
MOV al,[esi]
MOV Less[edx],al
INC edx ; for less array
JMP Next
Move_Greater:
MOV al,[esi]
MOV Greater[ebx],al
INC ebx ; for greater array
Next:
INC esi
LOOP L
jmp Continue
;-----------------
main PROC
MOV esi,OFFSET Numbers
MOV ebx,Len
CALL Quick_Sort
MOV edi,OFFSET Sorted
MOV edi,OFFSET Sorted
MOV ecx,LENGTHOF Sorted
lo:
mov eax,0
mov al,[edi]
call writeint
INC edi
LOOP lo
CALL crlf
exit
main ENDP
END main
答案 0 :(得分:0)
您的代码已经停止了。要返回值或指向列表的指针,通常只需将值或指针放在eax中的列表中并返回。
为了响应OP对c#快速排序的异常实现,这里是单个函数Hoare分区方案快速排序的c#示例:
static public void Quicksort(int [] a, int lo, int hi)
{
if (lo >= hi)
return;
int p = a[(lo + hi) / 2];
int i = lo, j = hi;
i--; // partition
j++;
while (true)
{
while (a[++i] < p) ;
while (a[--j] > p) ;
if (i >= j)
break;
int t = a[i];
a[i] = a[j];
a[j] = t;
}
Quicksort(a, lo, j); // recurse
Quicksort(a, j + 1, hi);
}