基本思想:
在要排序的一组数中,对当前还未排好序的范围内的全部数,自上
而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较
小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要
求相反时,就将它们互换
c++实现
#include<iostream>
using namespace std;
//冒泡排序
//;arr=edx,n=ecx,i=esi,j=edi
//;n-1-i=ebx=ecx-1-esi
int arr[]={60,30,40,50,1,70,80,100,90,5};
void bubble(int a[],int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n-1-i;j++)
{
if(arr[j]>arr[j+1])
{
int t=arr[1+j];
arr[j+1]=arr[j];
arr[j]=t;-----
}
}
}
return;
}
int main()
{
bubble(arr,sizeof(arr)/4);
return 0;
}
汇编实现
;冒泡排序
include irvine32.inc
;arr=edx,n=ecx,i=esi,j=edi
;n-1-i=ebx=ecx-1-esi
.data
arr dd 60,30,40,50,1,70,80,100,90,5
n dd ($-arr)/4
.code
main proc
mov edx,offset arr
mov ecx,n
call bubble
call print
exit
main endp
bubble proc
mov esi,0
again1: cmp esi,ecx
je final
mov edi,0 ;j=0
mov ebx,ecx ;n
sub ebx,1 ;n-1
sub ebx,esi ;n-1-i
again2: cmp edi,ebx
je next
mov eax,[edx+4*edi]
cmp eax,[edx+4*edi+4]
jna next_2
push [edx+4*edi+4]
push [edx+4*edi]
pop [edx+4*edi+4]
pop [edx+4*edi]
next_2: inc edi
jmp again2
next:
call print
call crlf
inc esi
jmp again1
final: ret
bubble endp
print proc
mov ebp,0
again: cmp ebp,ecx
je final
mov eax,[edx+4*ebp]
call writeint
mov al,' '
call writechar
inc ebp
jmp again
final: ret
print endp
end main