-
-
[旧帖] [原创]基数排序的汇编实现 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
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
赞赏
他的文章
- [求助]科摩多的病毒分析师职位怎么样? 11916
- [求助]病毒分析师和安全开发工程师哪个靠谱? 12339
- [求助]信息安全专业毕业生找什么单位比较靠谱? 1623
- [求助]有人能在装有比特梵德的机子上写一个后台程序吗 1373
- [原创]自主设计贪吃蛇游戏源码 2735
看原图
赞赏
雪币:
留言: