首页
社区
课程
招聘
[旧帖] [原创]基数排序的汇编实现 0.00雪花
发表于: 2012-6-9 20:30 813

[旧帖] [原创]基数排序的汇编实现 0.00雪花

2012-6-9 20:30
813
截止今日放出的排序算法的汇编实现有(可以参考论坛中我之前的帖子)
1.《堆排序》
2.《快速排序》

今天放出基数排序的masm实现,要知道堆排序和快速排序算法都是属于"比较"排序的范畴,也就是通过不断的比较两个数的大小来排序。这样的排序算法可以映射到决策树之中,关于决策树我不做过多介绍,大家可以参考算法导论,另外由于映射后决策树的高度最少为n*lgn,所以基于比较的排序算法的最坏时间复杂度至少要O(n*lgn)。----有点拗口,简单说就是比较排序的这些算法的复杂度的极限就是O(n*lgn),不会再快了,这是数学上证明了的

而基数排序算法不属于比较排序算法,因为它是通过计数的方式进行排序的,具体的算法原理,也不赘述,不过基数排序对于待排数据要求较多,而且还需要辅助存储空间,所以虽然它的最大时间复杂度是线性的(O(n)),但是实际使用时很多时候不如快排和堆排序更好用。

好了,废话少叙,放出代码

.386
.model flat, stdcall

include windows.inc
include user32.inc
include kernel32.inc

includelib kernel32.lib
includelib user32.lib
includelib msvcrt.lib

printf PROTO C :VARARG
getchar proto C

.data
array                dd         0, 329, 457, 657, 839, 436, 720, 355
lastarray        dd 8 dup (0)

A                                dd 8 dup (0)
B                                dd 8 dup (0)
Carray                        dd 10 dup (0)

szMessage                db "%d ",0

.code

start:
        call main
       
        xor ebx, ebx
        inc ebx
       
        .while ebx < 8
       
                push lastarray[ebx*4]
                push offset szMessage
                call printf
                add esp, 8
                inc ebx
               
        .endw
       
        call getchar

main proc

        ;先对个位数进行排序
        xor ecx,ecx
        inc ecx
       
        .while ecx < 8
       
                xor edx, edx
                mov eax, array[ecx*4]
                mov ebx, 10
                div ebx
               
                mov A[ecx*4], edx
               
                inc ecx
                               
        .endw
       
        push 10
        call CountSort
       
        xor ecx,ecx
        inc ecx
       
        .while ecx < 8
                mov eax, lastarray[ecx*4]
                mov array[ecx*4], eax
                inc ecx
        .endw
       
       

       
        ;再对十位排序
        xor ecx,ecx
        inc ecx
       
        .while ecx < 8
       
                xor edx, edx
                mov eax, array[ecx*4]
                mov ebx, 10
                div ebx
               
                xor edx, edx
                div ebx
               
                mov A[ecx*4], edx
               
                inc ecx
                               
        .endw
       
       
        push 10
        call CountSort
       
        xor ecx,ecx
        inc ecx
       
        .while ecx < 8
                mov eax, lastarray[ecx*4]
                mov array[ecx*4], eax
                inc ecx
        .endw
       
        ;最后对百位进行排序
        xor ecx,ecx
        inc ecx
       
        .while ecx < 8
       
                xor edx, edx
                mov eax, array[ecx*4]
                mov ebx, 100
                div ebx
               
               
                mov A[ecx*4], eax
               
                inc ecx
                               
        .endw
       
        push 10
        call CountSort
       
        ret
       

main endp

CountSort        proc  k:DWORD
       
        ;清空c数组
        xor eax, eax
        .while eax < k
       
                mov Carray[eax*4], 0
                inc eax
               
        .endw
       
       
        ;对A数组中的数字计数
        xor eax, eax
        inc eax
       
        .while eax < lengthof A
                mov ebx, A[eax*4]
                mov ecx, Carray[ebx*4]
                inc ecx
               
                mov Carray[ebx*4], ecx
               
                inc eax
        .endw
       
       
        ;进行计数累加
        xor eax, eax
        inc eax
        .while eax < k
                mov ebx, Carray[eax*4]
                dec eax
                add ebx, Carray[eax * 4]
               
                inc eax
                mov Carray[eax*4], ebx
               
                inc eax
        .endw
       
        ;排序
        mov eax, lengthof A -1
       

        .while (eax > 0) && (eax < lengthof A)
                mov ebx, A[eax*4]
                mov ecx, Carray[ebx*4]       
                mov B[ecx*4], ebx
               
                ;这里对基数数组排序
                mov edx, array[eax*4]
                mov lastarray[ecx*4], edx
               
                dec ecx
                mov Carray[ebx*4], ecx
               
                dec eax
        .endw

        ret

CountSort endp

end start

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//