汇编实现直接插入排序的方法示例

上一篇实现了简单插入排序的算法,这一篇主要实现直接插入排序算法:

S0 SEGMENT STACK
  DW 20 DUP(?)
TOP LABEL  WORD
S0 ENDS

S1 SEGMENT
TIP DB "Input ten number and separate the numbers with space:", 0DH, 0AH, 24H
ARY DW 20 DUP(0)
CRLF  DB 0DH, 0AH, 24H
N  DW 0
E  DW 0
S1 ENDS

S2 SEGMENT
  ASSUME SS:S0, DS:S1, CS:S2, ES:S1
P  PROC  FAR
  MOV AX, S0
  MOV SS, AX
  LEA SP, TOP

  MOV AX, S1
  MOV DS, AX

  MOV AX, S1
  MOV ES, AX

  LEA DX, TIP
  MOV AH, 9
  INT 21H

  LEA SI, ARY

  XOR DX, DX
  PUSH  DX
  MOV BL, 10
  MOV CX, 10

INPUT: MOV AH, 1
  INT 21H
  CMP AL, 20H ;空格分隔字符
  JE SAVE
  ;输入十进制数,将数存入SI对应的内存单元
  MOV DL, AL
  MOV AX, [SI]
  MUL BL
  SUB DL, 30H
  ADD AL, DL
  MOV [SI], AX
  JMP INPUT
SAVE:
  ADD SI, 2
  LOOP  INPUT
  ;数组保存完毕

  LEA SI, ARY
  MOV DI, SI
  ADD DI, 2
  SUB SI, 2
  MOV E, SI  ;E用于存放数组的前一个地址,用来判断遍历结束
  ADD SI, 2

  XOR AX, AX ;AX用来存插入元素的地址
  MOV CX, 9  ;总循环次数

GO: MOV BX, [DI]
  PUSH  SI ;第一个数的位置压栈
CMPA:  CMP BX, [SI]
  JA SEL
  ;小于就把AX的值存放当前要插入的位置
  MOV AX, SI
  SUB SI, 2
  CMP SI, E
  JNE CMPA
SEL:  CMP AX, 0  ;判断AX是否又被修改过,没有说明当前数比前面的数大
  JE CON

  POP SI ;取出第一个数字的位置
  ;从AX到SI这一段的所有数字往后移动一个位置
CHANGE: MOV DX, [SI]
  XCHG  DX, [SI+2]
  ;当SI表示的位置在AX前面了,说明移动完成
  MOV BP, SI
  SUB SI, 2
  CMP AX, BP
  JNE CHANGE

  MOV SI, AX
  MOV [SI], BX
CON:  ADD DI, 2  ;继续下一次
  MOV SI, DI
  SUB SI, 2
  XOR AX, AX ;同时需要清空AX
  CALL  PRINT
  LOOP  GO

EXIT:  MOV AH, 4CH
  INT 21H

P  ENDP

;以下为十进制输出数组中的所有数
PRINT  PROC  NEAR
  PUSH  SI
  PUSH  CX
  PUSH  AX
  PUSH  DX
  LEA DX, CRLF
  MOV AH, 9
  INT 21H

  LEA SI, ARY
  MOV CX, 10
L1: MOV AX, [SI]
  MOV N, AX
  CALL  OUTPUT
  ADD SI, 2
  MOV DX, 20H
  MOV AH, 2
  INT 21H
  LOOP  L1

  POP DX
  POP AX
  POP CX
  POP SI
  RET

PRINT  ENDP

OUTPUT PROC  NEAR
  PUSH  AX
  PUSH  BX
  PUSH  CX
  PUSH  DX

  XOR CX, CX
  MOV AX, N
  MOV BX, 10
L2: XOR DX, DX
  DIV BX
  PUSH  DX
  INC CX
  CMP AX, 0
  JNE L2

L3: POP DX
  ADD DX, 30H
  MOV AH, 2
  INT 21H
  LOOP  L3

  POP DX
  POP CX
  POP BX
  POP AX
  RET
OUTPUT ENDP

S2 ENDS
  END P

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 汇编实现简单选择排序的方法示例

    上阵子重温数据结构,差不多更新到排序.这学期学了汇编语言,其中有几个实验便是实现内部排序算法.以下是实现简单选择排序的程序设计: S0 SEGMENT STACK DW 20 DUP(?) TOP LABEL WORD S0 ENDS S1 SEGMENT TIP DB "Input ten number and separate the numbers with space:", 0DH, 0AH, 24H ARY DW 20 DUP(0) CRLF DB 0DH, 0AH, 24H

  • 汇编实现冒泡排序的方法示例

    冒泡排序算法的运作如下:(从后往前) 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 3.针对所有的元素重复以上的步骤,除了最后一个. 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. 以下为实现代码: S0 SEGMENT STACK DW 30 DUP(?) TOP LABEL WORD S0 ENDS S1 SEGMENT TIP DB "Input

  • 汇编语言 输入10个数排序并输出的实现

    一:题目描述 在键盘输入任意10个数 按从小到大排序后,在计算机屏幕上先输出来.要有结果提示(字符串显示). 将10个数做累加,结果在计算机屏幕显示累加和. 二:伪指令的定义 1.数据段 ATAS SEGMENT string_1 DB 'Please input a numbers(0-65536):','$' string_2 DB 'ERROR: OVERFLOW! Please input again:','$' string_3 DB 'The array you have input

  • 汇编实现直接插入排序的方法示例

    上一篇实现了简单插入排序的算法,这一篇主要实现直接插入排序算法: S0 SEGMENT STACK DW 20 DUP(?) TOP LABEL WORD S0 ENDS S1 SEGMENT TIP DB "Input ten number and separate the numbers with space:", 0DH, 0AH, 24H ARY DW 20 DUP(0) CRLF DB 0DH, 0AH, 24H N DW 0 E DW 0 S1 ENDS S2 SEGMEN

  • Golang 实现插入排序的方法示例(2种)

    再次研究了插入排序的概念:定义一个有序的数据序列a,将待排序的序列b中的数依次插入到a的合适位置,插入后仍然有序 总结其与冒泡.选择的区别在于,内部迭代的次数是逐渐增大的,二后两者随着排序进行迭代次数逐渐减少 尝试基于Go的实现: 插入排序都采用in-place在数组上实现.具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素 在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序的元素小于或者等于新元素的位

  • Java实现折半插入排序算法的示例代码

    目录 排序算法介绍 折半插入排序 原理 代码实现 复杂度分析 算法实践 排序算法介绍 排序算法是通过特定的算法因式将一组或多组数据按照既定模式进行重新排序.最终序列按照一定的规律进行呈现. 在排序算法中,稳定性和效率是我们经常要考虑的问题. 稳定性:稳定是指当两个相同的元素同时出现于某个序列之中,则经过一定的排序算法之后,两者在排序前后的相对位置不发生变化. 复杂度分析: (1)时间复杂度:即从序列的初始状态到经过排序算法的变换移位等操作变到最终排序好的结果状态的过程所花费的时间度量. (2)空

  • oracle中decode函数的使用方法示例

    decode的几种用法 1:使用decode判断字符串是否一样 DECODE(value,if1,then1,if2,then2,if3,then3,...,else) 含义为 IF 条件=值1 THEN RETURN(value 1) ELSIF 条件=值2 THEN RETURN(value 2) ...... ELSIF 条件=值n THEN RETURN(value 3) ELSE RETURN(default) END IF sql测试 select empno,decode(empn

  • Oracle数据行拆分多行方法示例

    工作和学习中常常会遇到一行要分割成多行数据的情况,在此整理一下做下对比. 单行拆分 如果表数据只有一行,则可以直接在原表上直接使用connect by+正则的方法,比如: select regexp_substr('444.555.666', '[^.]+', 1, level) col from dual connect by level <= regexp_count('444.555.666', '\.') + 1 输出结果: COL ---- 444 555 666 多行拆分 如果数据表

  • swift 3.0中实现字符串截取、比较的方法示例

    前言 字符串处理一直都是程序开发中不可避免的,而字符串截取/替换操作更是频繁.swift3.0 中不能直接使用下标数字进行字符串解决,只能使用String.Index来做位置索引,要想实现截取功能首先得获取到String.Index; 下面话不多说了,来一起看看详细的介绍吧. 实例代码 下面两段代码获取开头可结尾,获取中间部分参数用Range<Index>即可: 获取结尾两个字符子串: let sessionId = "this is a test" let index =

  • Go语言实现冒泡排序、选择排序、快速排序及插入排序的方法

    本文实例讲述了Go语言实现冒泡排序.选择排序.快速排序及插入排序的方法.分享给大家供大家参考.具体分析如下: 算法是程序的灵魂,而排序算法则是一种最基本的算法.排序算法有许多种,这里介绍4中排序算法:冒泡排序,选择排序,快速排序和插入排序,以从小到大为例. 一.冒泡排序 冒泡排序的原理是,对给定的数组进行多次遍历,每次均比较相邻的两个数,如果前一个比后一个大,则交换这两个数.经过第一次遍历之后,最大的数就在最右侧了:第二次遍历之后,第二大的数就在右数第二个位置了:以此类推. 复制代码 代码如下:

  • 使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)

    这是一个示例: <html> <head> <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.js"></script> <script type="text/javascript"> $(document).ready(function(){ $(".btn1").cl

  • vue不通过路由直接获取url中参数的方法示例

    前言 众所周知vue中使用路由的方式设置url参数,但是这种方式必须要在路径中附带参数,而且这个参数是需要在vue的路由中提前设置好的. 相对来说,在某些情况下直接在url后面拼接?mid=100的方式传递参数更灵活,你不需要设置路由,只需要在url后拼接参数即可,但是这种方式就需要通过javascript获取并提取url中的参数,通过传统的方式直接在页面中获取是行不通的了,因为vue中是无法通过location.search()来获取url问号之后的内容的. 当然,这个问题也有解决方法,就是把

  • 微信小程序实现实时圆形进度条的方法示例

    前言 最近工作中为了做一个录制按钮,研究了下小程序的实时圆形进度条实现,下面这篇文章就来给大家详细的介绍了实现的方法示例,废话不多说,先来看看效果图吧. 效果图如下 初始状态 点击中间按钮开始绘制 绘制过程 绘制结束 实现思路 建立两个canvas标签,先绘制底层的浅灰色圆圈背景,再绘制上层的红色进度条. WXML代码 <view class="wrap"> <view class="circle-box"> <canvas class

随机推荐