linux汇编冒泡排序,汇编语言冒泡排序简述

冒泡排序从位置 0 和 1 开始,对比数组的两个数值。如果比较结果为逆序,就交换这两个数。下图展示了对一个整数数组进行一次遍历的过程。

408b5b1eb4f3f73d4bd64cb323508e95.gif

一次冒泡过程之后,数组仍没有按序排列,但此时最高索引位置上是最大数。外层循环则开始对该数组再一次遍历。经过 1 次遍历后,数组就会按序排列。

冒泡排序对小型数组效果很好,但对较大的数组而言,它的效率就十分低下。计算机科学家在衡量算法的相对效率时,常常使用一种被称为 “时间复杂度”(big-O)的概念来描述随着处理对象数量的增加,平均运行时间是如何增加的。

冒泡排序是 O (n²) 算法,这就意味着,它的平均运行时间随着数组元素 (n) 个数的平方增加。比如,假设 1000 个元素排序需要 0.1 秒。当元素个数增加 10 倍时,该数组排序所需要的时间就会增加 10² (100) 倍。

下表列出了不同数组大小需要的排序时间,假设 1000 个数组元素排序花费 0.1 秒:

数组大小时间(秒)数组大小时间(秒)

1 000

0.1

100 000

1000

10 000

10.0

1 000 000

100 000 (27.78 小时)

对于一百万个整数来说,冒泡排序谈不上有效率,因为它完成任务的时间太长了!但是对于几百个整数,它的效率是足够的。

用类似于汇编语言的伪代码为冒泡排序编写的简化代码是有用的。代码用 N 表示数组大小,cx1 表示外循环计数器,cx2 表示内循环计数器:

cx1 = N - 1

while( cxl > 0 )

{

esi = addr (array)

cx2 = cx1

while ( cx2 > 0 )

{

if(array[esi] > array[esi+4])

exchange(array[esi], array[esi+4])

add esi,4

dec cx2

}

dec cxl

}

如保存和恢复外循环计数器等的机械问题被刻意忽略了。注意内循环计数 (cx2) 是基于外循环计数 (cx1) 当前值的,每次遍历数组时它都依次递减。

根据伪代码能够很容易生成与之对应的汇编程序,并将它表示为带参数和局部变量的过程:

;----------------------------------------

;BubbleSort

;使用冒泡算法,将一个 32 位有符号整数数组按升序进行排列。

;接收:数组指针,数组大小

;返回:无

;----------------------------------------

BubbleSort PROC USES eax ecx esi,

pArray:PTR DWORD, ;数组指针

Count: DWORD ;数组大小

mov ecx,Count

dec ecx ;计数值减1

L1: push ecx ;保存外循环计数值

mov esi,pArray ;指向第一个数值

L2: mov eax, [esi] ;取数组元素值

cmp [esi+4],eax ;比较两个数值

jg L3 ;如果[ESI]<=[ESI + 4],不交换

xchg eax, [esi+4] ;交换两数

mov [esi],eax

L3: add esi,4 ;两个指针都向前移动一个元素

loop L2 ;内循环

pop ecx ;恢复外循环计数值

loop L1 ;若计数值不等于0,则继续外循环

L4: ret

BubbleSort ENDP

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值