快速排序的非递归实现
include Irvine32.inc
arraySize = 250000
.data
array DWORD arraySize dup(?)
pivot DWORD ?
starttime dword ?
.code
main PROC
call Randomize
mov ecx,arraySize
mov esi,0
mov eax,arraySize
L1:
call Random32
mov array[esi*type array],eax
inc esi
loop L1
call GetMseconds
mov starttime,eax
mov eax,0
mov ebx,arraySize -1
call quickSort
call GetMseconds
sub eax,starttime
call WriteInt
call Crlf
exit
main endp
Partition proc
pushad
mov edx,array[eax*type array]
L1:
cmp eax,ebx
jae stop
L2:
cmp eax,ebx
jae L3
cmp array[ebx*type array],edx
jl L3
dec ebx
jmp L2
L3:
mov ecx,array[ebx*type array]
mov array[eax*type array],ecx
L4:
cmp eax,ebx
jae L5
cmp array[eax*type array],edx
jg L5
inc eax
jmp L4
L5:
mov ecx,array[eax*type array]
mov array[ebx*type array],ecx
jmp L1
stop:
mov array[eax*type array],edx
mov pivot,eax
popad
ret
Partition endp
quickSort proc
pushad
.data
temp DWORD 0
.code
mov temp,esp
push eax
push ebx
L1:
cmp esp,temp
je stop
pop ebx
pop eax
call Partition
dec pivot
cmp eax,pivot
jge L2
push eax
push pivot
L2:
add pivot,2
cmp ebx,pivot
jle L3
push pivot
push ebx
L3:
jmp L1
stop:
popad
ret
quickSort endp
END main
使用汇编语言实现的非递归的快速排序程序,其中,使用eax与ebx传递待排数组下标范围。