汇编语言(五)之冒泡排序程序及其改进方法

汇编语言:冒泡排序及其改进方法

题目

在数据区存放一组数据,要求采用冒泡排序对该数据区中的数据按递增关系排列。

设计思想

1.内层循环 从第一个数开始,依次把相邻的两个数进行比较,即第n个数和第n+1个数进行比较,如果第s[n]<s[n+1],则n++继续比较;如果s[n]>s[n+1],交换s[n]和s[n+1]。直到最后剩下的数字全部比较完毕,其实就是取出这些数字里面最大的放在最后一位。
2. 外层循环对剩下的N-1个数字重复步骤一,找到剩下的N-1个数字中的最大的数字,在比较过程中将其移至最后第N-1位。
3. 重复步骤二直到顺序排列好(注:这里只需要进行N-1次外层循环即可,因为最后一个次比较只剩下一个数字,此时无须比较)。
4. 改进方案:因为外层循环在没有全部进行完之后就有可能顺序正确了(考虑:123476排序,只进行一次外层循环顺序就正确了),这时候我们可以设置一个标志位flag,每次外层循环前将其清零,如果在比较的过程中有交换那么我们就flag++,否则就不操作。外层循环结束时,如果flag==0,那么我们就直接结束程序不再进行后续循环。

流程图

我们以N等于10为例进行编程,如果数字排序个数不一样需要调整参数

Created with Raphaël 2.2.0 开始 cx_外=9 flag=0 s[i]<s[i+1] cx_内==0 flag==0 结束 cx_外==0 flag++,swap s[i]&s[i+1] yes no yes no yes no yes no

程序代码及运行

运行环境

Windows10
DOSBox0.74-3,Cpu speed:3000cycles

代码

	data segment
	org 3000h
		num	db 30h,35h,36h,37h,40h,79h,66h,78h,67h,60h
	org 3010h
		flag db ? 
	data ends
	code segment
	assume cs:code,ds:data
	start:
		mov ax,data
		mov ds,ax
		mov cx,9;外循环次数
		mov bx,0;标志位flag
		
	outer:
		push cx;将外循环次数入栈
		mov si,offset num
		mov di,offset flag
		mov byte ptr[di],0
		add bx,1
		
	inner:
		mov al,[si]
		cmp al,[si+1]
		jbe noswap
		xchg al,[si+1]
		mov [si],al
		add byte ptr[di],1
	noswap:
		add si,1
		loop inner
		
		cmp byte ptr[di],0
		je exitip
		pop cx;外循环次数出栈
		loop outer
	
	exitip:
		mov ah,4ch
		int 21h
	
	code ends
	end start

运行过程

在这里插入图片描述
在这里插入图片描述

发布了17 篇原创文章 · 获赞 16 · 访问量 1187

猜你喜欢

转载自blog.csdn.net/XYshaonianhaofang/article/details/103365709
今日推荐