// 快排.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
using namespace std;
int a[100],n;
void swap(int i, int j)
{
int t = a[j];
a[j] = a[i];
a[i] = t;
}
void quicksort(int l,int r)
{
if (l > r)
return;
int i, j;
i = l, j = r;
while (i < j)
{
while (i < j && a[j] >= a[l])
{
j--;
}
while (i < j && a[i] <= a[l])
{
i++;
}
if (i >= j)
break;
swap(i, j);
}
swap(i, l);
quicksort(l,i - 1);
quicksort(i + 1, r);
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
quicksort(0, n - 1);
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
system("pause");
return 0;
}
这是C++代码。
汇编代码:
1.封装了四个函数:swap() (交换函数)、qiucksort() (快排函数)、scanf() (读入数组)、print (输出数组)。
2.利用call quicksort 来递归函数。
3.利用栈的push、pop操作来解决函数之间传参的问题。
INCLUDE irvine32.inc
.data
dat dd 4,8,6,9,2,3,4,7,2,10
cnt dd ?
l dd ?
r dd ?
.code
start:
mov eax,10
mov cnt,eax
call scanf
;初始化l,r
mov eax,0
mov l,eax;
mov eax,9
mov r,eax
;调用快排
call quicksort
call print
exit
;封装交换函数
swap proc
;利用xchg 可以少用一个寄存器来充当临时变量
mov edx,dat[esi*4];
xchg edx,dat[ebx*4];
xchg edx,dat[esi*4];
ret
swap endp
quicksort proc
mov eax,l
cmp eax,r
jg over
xor esi,esi;
xor ebx,ebx;
mov esi,l;i
mov ebx,r;j
mov eax,dat[esi*4]
sort_again:
cmp ebx,esi; while (i!=j)
je over_loop;
loop_j_again:
cmp esi,ebx; while(i<j)
jge over_loop
cmp eax,dat[ebx*4]; while (a[j]>=a[l])
jg loop_i_again
add ebx ,-1 ; j--
jmp loop_j_again;
loop_i_again:
cmp esi,ebx; while (i<j)
jge over_loop
cmp eax,dat[esi*4]; while (a[l]>=a[i])
jl compare;
add esi,1; i++
jmp loop_i_again;
compare:
cmp esi,ebx; if (i>=j)
jge over_loop; break
call swap; swap(i,j)
jmp sort_again
over_loop:
mov ebx,l;
call swap; swap(i,l)
push esi; push i
push r ;push r
mov r,esi
add r ,-1
call quicksort; quicksort(l,i-1);
pop r
pop ebx
mov l,ebx;
inc l
call quicksort; quicksort(i+1,r);
over:
ret
quicksort endp
;封装一个输出函数
print proc
mov ecx,cnt
xor esi,esi
print_again:
mov eax,dat[esi*4]
call writeint
call crlf
inc esi;
loop print_again
ret
print endp
;封装输入函数
scanf proc
mov ecx,cnt
xor esi,esi
scanf_again:
call readint
mov dat[esi*4],eax
inc esi;
loop scanf_again
ret
scanf endp
end start