1 冒泡排序

http://blog.csdn.net/a123443/article/details/6779137

;冒泡排序
;author JRH
;2011.7.10
assume ds:data
data segmenta dw 1,4,2,5,7,9,6,3
data ends
code segment
start:mov ax,datamov ds,axmov cx,8 dec cxlop1:push cxmov dx,0mov si,0lop2:  mov bp,a[si]cmp bp,a[si+2]jnb go_onxchg bp,a[si+2]mov a[si],bpmov dx,1 ;标志位go_on:add si,2loop lop2pop cxcmp dx,0 jz overloop lop1over:mov ax,4c00hint 21h
code ends
end start

以下代码来自RadASM自带库;

2 递归排序

assort.asm

    .486                      ; force 32 bit code.model flat, stdcall      ; memory model & calling conventionoption casemap :none      ; case sensitiveasqsort PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORDacisort PROTO :DWORD,:DWORD.codeassort proc arr:DWORD,cnt:DWORD,rdi:DWORD.if rdi == 0mov rdi, 100                      ; set default maximum recursion depth.endifmov eax, cntsub eax, 1invoke asqsort,arr,0,eax,0,rdixor eax, eax                        ; exit with EAX = 0 is quick sortedtest edx, edx                       ; if EDX = 0 quick sort failed byjnz @F                              ; exceeding maximum recursion depthinvoke acisort,arr,cntmov eax, 1                          ; exit with EAX = 1 is CISORTed@@:retassort endpend

rdi为最大递归深度
本过程调用了asqsort和acisort

3 快速排序

asqsort.asm

    .486                      ; force 32 bit code.model flat, stdcall      ; memory model & calling conventionoption casemap :none      ; case sensitive.codeasqsort proc arr:DWORD,i:DWORD,j:DWORD,rec:DWORD,ind:DWORDtest edx, edxjz quitmov eax, icmp eax, jjge quitadd rec, 1                  ; increment recursion depth indicatormov eax, reccmp eax, indjl @Fxor edx, edx                ; set bailout indicatorjmp quit@@:mov [esp-8], ebxmov [esp-12], esimov [esp-16], edimov edi, arrmov esi, imov ebx, jmov [esp-20], ebp           ; save EBPmov edx, [edi+ebx*4]        ; pivot is from higher index valuesub ebx, 1cmp esi, ebxjg lbl5lbl0:sub esi, 1align 4lbl1:add esi, 1                  ; increment lower index; ***************************mov ecx, [edi+esi*4]        ; load lower index stringmov ebp, -1sts0:add ebp, 1mov al, [ecx+ebp]           ; compare lower and pivot stringscmp al, [edx+ebp]jg nxt0jl lbl1test al, aljnz sts0nxt0:; ***************************align 4lbl2:; ***************************mov ecx, [edi+ebx*4]        ; load upper index stringmov ebp, -1sts1:add ebp, 1mov al, [ecx+ebp]           ; compare upper and pivot stringscmp al, [edx+ebp]jg nxt1jl lbl3test al, aljnz sts1nxt1:; ***************************sub ebx, 1                  ; decrement upper indexcmp ebx, esijge lbl2lbl3:cmp esi, ebxjg lbl5mov eax, [edi+esi*4]        ; swap pointersmov ecx, [edi+ebx*4]mov [edi+esi*4], ecxmov [edi+ebx*4], eaxadd esi, 1sub ebx, 1cmp esi, ebxjle lbl0lbl5:mov ebp, [esp-20]           ; restore EBP before using LOCALmov eax, jmov edx, [edi+esi*4]mov ecx, [edi+eax*4]mov [edi+esi*4], ecxmov [edi+eax*4], edxmov eax, esimov ebx, [esp-8]mov esi, [esp-12]mov edi, [esp-16]push eaxsub eax, 1invoke asqsort,arr,i,eax,rec,ind@@:pop eaxadd eax, 1invoke asqsort,arr,eax,j,rec,indquit:retasqsort endpend

快速排序(Quicksort)是对冒泡排序的一种改进。
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外
一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归
进行,以此达到整个数据变成有序序列。

输入参数为i,j,rec,ind;四个DWORD类型;
如果edx为0直接退出;
i小于j直接退出;
JGE:如果大于或等于(>=)则跳转
rec:递归深度指示变量
首先把ebx,esi,edi的值存入堆栈;
数组首址是arr,放入edi;
在lbl5段和@@段中调用了自身;

4 acisort

acisort.asm

    .486                      ; force 32 bit code.model flat, stdcall      ; memory model & calling conventionoption casemap :none      ; case sensitiveinclude \masm32\macros\macros.asmaissort PROTO :DWORD,:DWORD.codealign 4acisort proc arr:DWORD,cnt:DWORDLOCAL gap   :DWORDLOCAL sflag :DWORDLOCAL hflag :DWORDLOCAL eflag :DWORDpush ebxpush esipush edimov eax, cntmov gap, eax                ; copy cnt to gapmov ebx, arr                ; address of 1st elementdec cnt; --------------------------------------------------;        bi-directional COMB preordering pass; --------------------------------------------------setgap:fild gap                    ; load integer memory operand to dividefdiv FP8(1.35)              ; divide gap by constantfistp gap                   ; store result back in integer memory operandsub gap, 1                  ; round down by 1cmp gap, 10jg @Fcmp gap, 9                  ; comb 11 codejl @Fmov gap, 11@@:cmp gap, 1jle nxt                     ; exit when gap <= 1mov edi, cntsub edi, gapmov eflag, edixor ecx, ecx                ; low value indexinner:mov edx, ecxadd edx, gap                ; high value indexpush ebpmov ebp, [ebx+ecx*4]        ; lower valuemov esi, [ebx+edx*4]        ; swap valuesmov edi, -1; ===========================================cmpstrings:add edi, 1mov al, [ebp+edi]           ; compare both stringscmp al, [esi+edi]jl noswap                   ; ascending sortjg swap                     ; swap these two labels for descendingtest al, aljnz cmpstrings; ===========================================jmp noswapswap:mov [ebx+edx*4], ebpmov [ebx+ecx*4], esinoswap:pop ebpadd ecx, 1cmp ecx, eflagjle inner; *******************************fild gap                    ; load integer memory operand to dividefdiv FP8(1.4)               ; divide gap by constantfistp gap                   ; store result back in integer memory operandsub gap, 1                  ; round down by 1cmp gap, 10jg @Fcmp gap, 9                  ; comb 11 codejl @Fmov gap, 11@@:cmp gap, 1jle nxt                     ; exit when gap <= 1mov ecx, cntsub ecx, gap                ; calculate ECX as cnt - gaprinner:mov edx, ecxadd edx, gap                ; high value indexpush ebpmov ebp, [ebx+ecx*4]        ; lower valuemov esi, [ebx+edx*4]        ; swap valuesmov edi, -1; ===========================================rcmpstrings:add edi, 1mov al, [ebp+edi]           ; compare both stringscmp al, [esi+edi]jl rnoswap                  ; ascending sortjg rswap                    ; swap these two labels for descendingtest al, aljnz rcmpstrings; ===========================================jmp rnoswaprswap:mov [ebx+edx*4], ebpmov [ebx+ecx*4], esirnoswap:pop ebpsub ecx, 1jnz rinnerjmp setgapnxt:inc cntinvoke aissort,arr,cnt      ; call the insertion sort to clean up the restdone:pop edipop esipop ebxretacisort endpend

输入参数:arr,cnt;数组和个数;
本地变量:gap,sflag,hflag,eflat;三个标志变量;
调用了插入排序(aissort)来清除rest;
rcmpstrings段:
比较ebp+edi指向的值和esi+edi指向的值,
小于转到rnoswap
大于转到rswap
rswap-交换:
把ebp存入ebx+edx*4的地址;
把esi存入ebx+ecx*4的地址;

5 插入排序(升序)

aissort.asm

    .486                      ; force 32 bit code.model flat, stdcall      ; memory model & calling conventionoption casemap :none      ; case sensitive.codeOPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE align 4aissort proc arr:DWORD,cnt:DWORD; -------------------------------; ascending insertion string sort; -------------------------------mov [esp-8],  ebxmov [esp-12], esimov [esp-16], edimov [esp-20], ebpmov edi, [esp+4]            ; array addressmov edx, 1cmp edx, [esp+8]            ; compare count to EDXjge quitxor eax, eax                ; clear EAX of previous contententry:mov ebx, [edi+edx*4]mov esi, edxinner:mov ecx, [edi+esi*4-4]mov ebp, -1stcmp:                        ; string comparison loopadd ebp, 1mov al, [ecx+ebp]cmp al, [ebx+ebp]jl outerjg swaptest al, aljnz stcmpjmp outerswap:mov [edi+esi*4], ecxsub esi, 1jnz innerouter:mov [edi+esi*4], ebxadd edx, 1cmp edx, [esp+8]            ; compare count to EDXjl entryquit:mov ebx, [esp-8]mov esi, [esp-12]mov edi, [esp-16]mov ebp, [esp-20]ret 8aissort endpOPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef end.486                      ; force 32 bit code.model flat, stdcall      ; memory model & calling conventionoption casemap :none      ; case sensitive.codeOPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE align 4aissort proc arr:DWORD,cnt:DWORD; -------------------------------; ascending insertion string sort; -------------------------------mov [esp-8],  ebxmov [esp-12], esimov [esp-16], edimov [esp-20], ebpmov edi, [esp+4]            ; array addressmov edx, 1cmp edx, [esp+8]            ; compare count to EDXjge quitxor eax, eax                ; clear EAX of previous contententry:mov ebx, [edi+edx*4]mov esi, edxinner:mov ecx, [edi+esi*4-4]mov ebp, -1stcmp:                        ; string comparison loopadd ebp, 1mov al, [ecx+ebp]cmp al, [ebx+ebp]jl outerjg swaptest al, aljnz stcmpjmp outerswap:mov [edi+esi*4], ecxsub esi, 1jnz innerouter:mov [edi+esi*4], ebxadd edx, 1cmp edx, [esp+8]            ; compare count to EDXjl entryquit:mov ebx, [esp-8]mov esi, [esp-12]mov edi, [esp-16]mov ebp, [esp-20]ret 8aissort endpOPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef end

数组地址存入edi;
比较次数存入edx;
stcmp-字符串比较循环:比较的是ecx+ebp地址处的值和ebx+ebp地址处的值

6 插入排序(降序)

    .486                      ; force 32 bit code.model flat, stdcall      ; memory model & calling conventionoption casemap :none      ; case sensitive.codeOPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE align 4dissort proc arr:DWORD,cnt:DWORD; --------------------------------; descending insertion string sort; --------------------------------mov [esp-8],  ebxmov [esp-12], esimov [esp-16], edimov [esp-20], ebpmov edi, [esp+4]            ; array addressmov edx, 1cmp edx, [esp+8]            ; compare count to EDXjge quitxor eax, eax                ; clear EAX of previous contententry:mov ebx, [edi+edx*4]mov esi, edxinner:mov ecx, [edi+esi*4-4]mov ebp, -1stcmp:                        ; string comparison loopadd ebp, 1mov al, [ecx+ebp]cmp al, [ebx+ebp]jg outerjl swaptest al, aljnz stcmpjmp outerswap:mov [edi+esi*4], ecxsub esi, 1jnz innerouter:mov [edi+esi*4], ebxadd edx, 1cmp edx, [esp+8]            ; compare count to EDXjl entryquit:mov ebx, [esp-8]mov esi, [esp-12]mov edi, [esp-16]mov ebp, [esp-20]ret 8dissort endpOPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef end

汇编排序算法代码总结相关推荐

  1. php递归算法排序,php常用的排序算法代码[冒泡,递归排序-PHP源码

    <script>ec(2);<script> php 常用的排序算法代码[冒泡,递归排序 冒泡排序算法 function bubblesort($arr) { $n=count ...

  2. python排序算法代码

    python排序算法代码: def bubble_sort(nums):# 获取列表长度 size = len(nums)# 若列表长度为0或1,则直接返回if size <= 1:return ...

  3. java代码实现希尔排序_Java希尔排序算法代码实现

    Java希尔排序算法代码实现 时间:2017-08-30     来源:华清远见JAVA学院 什么是Java希尔排序算法呢? 希尔排序算法实际上是一种分组插入的排序算法,又被称为缩小增量排序.今天华清 ...

  4. 十大排序算法代码集锦(java)

    SortAlgorithm.java import java.util.*;class SortAlgorithm { //冒泡排序public int[] BubbleSort(int[] nums ...

  5. 考研408笔试之排序算法代码实现汇总

    各种排序算法汇总 因为分开写太麻烦了QAQ,直接放在一起吧. 写在前面 本文不详细探讨各种排序的原理,只涉及具体的代码实现,了解算法原理,翻阅一些资料可以写出各种排序的代码实现.本文进行汇总,以题目的 ...

  6. java排序算法代码_Java实现八种排序算法(代码详细解释)

    package八大排序算法;importjava.util.Arrays;importorg.junit.Test;/*** 1.插入排序 直接插入排序.希尔排序 折半插入排序 * 2.交换排序 冒泡 ...

  7. Java中常见的排序算法代码演示

    package cn.xbz;import java.util.Arrays;/*** 各种排序法的演示* @author xbz**/ public class ArraySort {public ...

  8. 链表冒泡排序java_055-冒泡排序算法代码实现

    2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...

  9. 水桶平分 java_关于java:桶排序算法代码问题

    我需要在Java中实现以下内容. 输入:整数数组 输出:重新排列数组以具有以下内容: 假设原始数组中的第一个元素的值为x 在新数组中,假设x在位置I,即data[I] = x.然后,对所有x和所有j ...

最新文章

  1. select每门可说大于90分_小女子风雨黑暗无惧 90分全自动反向折叠照明伞
  2. 119. Pascal's Triangle II (Graph; WFS)
  3. Django中url匹配规则的补充
  4. ARMV8/ARMV9指令集概述(翻译)
  5. photoshop cs3反应慢的原因
  6. 在java程序中使用protobuf
  7. Ollydbg使用教程学习总结(四)
  8. linux查看tcl版本_查看Linux内核版本的方法有几个?你也是这样操作吗?
  9. Docker exec 命令执行出错, 显示 the input device is not aTTY 的解决办法
  10. 智能门禁(3)---汉王智能人脸门禁系统
  11. redis设计与实现读书笔记(一)
  12. Python制作翻译软件(中英文互译)
  13. MySQL用户管理语句001
  14. php theexcerpt,wordpress使用the_excerpt函数显示文章的摘要信息
  15. 转载:bat批处理简易教程
  16. Java工作小组组名,起组名和口号大全
  17. 本体技术视点 | 数据的去中心化协作和可信流动(一)
  18. 刷(shui)题记录 2021.12
  19. 语言学句法分析树形图怎么画_语言学第四章树形图句法.doc
  20. 校园网能否实现wifi上网?

热门文章

  1. 小程序对象不去重合并
  2. 计算机系统的分类与发展方向
  3. DbVisualizer数据库连接工具默认查询结果只显示100条解决方法,dbvis如何展示更多行,如何显示全部数据
  4. c语言return 11,二级C语言教程章节测试11.对函数的进一步讨论
  5. idea使用ant将wsdl文件_文件曝光:奔驰GLC将使用E级同款1.5T发动机
  6. Fleury算法找欧拉环游
  7. \00在python中
  8. 人工智能算法--KNN算法(C++实现)
  9. 定义一个栈(Stack)类,用于模拟一种具有后进先出(LIFO)特性的数据结构
  10. 第二章:2.1 微分方程、差分方程求解(举例)