汇编排序知识之冒泡排序

这里简单介绍汇编中是如何进行冒泡排序的,首先先回顾C语言中的冒泡排序知识及算法,再讲解汇编实现的过程,更好的巩固和联系了编程的思想。

一. C语言——冒泡排序

冒泡排序的基本概念: 依次比较相邻的两个数,将小数放在前面,大数放在后面。每完成一遍查找都会找到一个最大数,直至排序结束.

 

由上表可见每轮排序都能确定一个最大数,直至排序结束,它相对应的C语言代码如下:其中j参数设置为N-i-1简化了排序的复杂度,也可以是N-1.

二.汇编——冒泡排序

相对应的汇编冒泡排序如下图所示:

DATAS SEGMENT
    A		   DW		0,15,70,30,32,89,12,12,34,4,38,23,45,13,43,24,54,24,54,1
    Count      EQU		($-A)/2  ;数组中元素的个数(字节)
DATAS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX
;-------------------------------------------------------------------------
;冒泡排序核心算法 A排序
    MOV CX,Count-1      ;外层循环执行n-1次
I10:
	XOR SI,SI           ;异或清零
	XOR DI,DI        

I20:
	MOV AX,A[SI]
	MOV BX,A[SI+2]
	CMP AX,BX

	;比较AX和BX大小:AX<BX(小于转移)跳转I30,否则交换两数
	JL  I30
	MOV A[SI],BX
	MOV A[SI+2],AX     ;交换位置

I30:
	ADD SI,2           ;SI加2:移动一个数字位置
	INC DI             ;DI加1
	CMP DI,CX           

	;比较CX和DI大小:DI<CX转移,CX为外层循环总数n-1
	JB  I20
	Loop I10           ;循环调至I10,Loop循环CX执行一次减1
;-------------------------------------------------------------------------
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

其中先在数据段中定义一个数组A并存储20个数,而Count=($-A)/2存储数组中元素的个数,其中$表示当前位置,即数组A中最后一个数位置减去A的起始位置,由于A是DW(2字节),所以除以2转换为数组个数:20.
依次比较A中相邻两个数,存储至AX=A[SI]和BX=A[SI+2]中,比较成立即交换否则跳转至SI加2,继续比较下一个相邻两数。
同时CX中记录外层循环次数Count-1.利用Loop循环,Loop每循环依次默认的CX寄存器会减1,直至为0,循环停止。DI中记录排序好的个数,每次加1与CX比较,直至排序结束。
输出如下图结果,这里就省略了输出函数。只是想讲讲冒泡排序的过程,见谅!!!

希望能帮助大家更好的理解C语言与汇编中的冒泡排序的联系与思想,谢谢!不足之处望读者谅解。By:Eastmount

时间: 2025-01-29 15:43:33

汇编排序知识之冒泡排序的相关文章

经典排序算法之冒泡排序(Bubble sort)代码_C#教程

经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第一次两两比较6 > 2交换(内循环) 交换前状态| 6 | 2 | 4 | 1 | 5 | 9 | 交换后状态| 2 | 6 | 4 | 1

Java实现的各种排序算法(插入排序、选择排序算法、冒泡排序算法)_java

一.插入排序算法实现java版本 public static int[] insert_sort(int[] a) { for (int i = 0; i < a.length; i++) { for(int j=i+1;j>0&&j<a.length;j--) { if(a[j]<a[j-1]) { int tmp = a[j]; //这样定义初始化逻辑上是可以的,j变量,每次tmp的值变化的 a[j] = a[j-1]; a[j-1] = tmp; } } }

C#的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序

插入|排序|算法 本文介绍了C#的四种排序算法:冒泡排序.选择排序.插入排序和希尔排序 冒泡排序 using System: namespace BubbleSorter { public class BubbleSorter { public void Sort(int [] list) { int i,j,temp: bool done=false: j=1: while((j<list.Length)&&(!done)) { done=true: for(i=0:i<li

C# 鸡尾酒排序(双冒泡排序、搅拌排序或涟漪排序)

using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace Sort { class CockTailSorter { private static int[] myArray; private static int arraySize; public static int[] Sort(int[] myArray) { arraySize = myArray.Len

内部排序算法:冒泡排序

基本思想 将被排序的记录数组R[0..n-1]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡.根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其 向上"飘浮".如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止. 具体过程,如下所示: 初始状态:R[0..n-1]为无序区. 第一趟扫描:从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下.重者 在上,则交换二者的位置,即依次比较(R[n-1], R[n-2]).(R

常见的排序算法三——冒泡排序

1.冒泡排序 原理:将序列划分为无序和有序区,不断通过交换较大元素至无序区尾完成排序. 要点:设计交换判断条件,提前结束以排好序的序列循环. 实现: Void BubbleSort(Node L[]) { Int i ,j; Bool ischanged;//设计跳出条件 For(j=n;j<0;j--) { ischanged =false; For(i=0;i<j;i++) { If(L[i]>L[i+1])//如果发现较重元素就向后移动 { Int temp=L[i]; L[i]=

我的Java开发学习之旅------&amp;gt;Java经典排序算法之冒泡排序

冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 一.算法原理 冒泡排序算法的运作如下: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 3.

排序算法之冒泡排序

冒泡排序 今天学习一下冒泡排序,它是最简单的一种排序算法.这里我们按照降序排列 原理 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上的步骤,除了最后一个. 持续每次对越来越少的元素重复上面的步骤,知道没有任何一对数字需要比较. 首先,里面用到的swap函数定义如下: //交换位置 void swap(int a[],int i,int j) { int temp =

汇编基础知识之输入输出

最近在学习汇编程序,但输入输出是我遇到的第一个难题,这里就简单讲诉一些汇编的基本输出输出字符串.字符.输出数字等知识,仅供大家学习.这只是一些基础知识,汇编高手亦可以温习一些基础的输入输出知识. 一.输出字符串 下面是调用9号功能输出字符串"Hello World"的代码. DATAS SEGMENT ;输出的字符串 13回车 10换行 $结束标志(\0) Input DB 13,10,'Hello Word!',13,10,'$' DATAS ENDS CODES SEGMENT A