VOLVE 5.0
Kforth Activity 1: Bubble Sort
This example implements bubble sorting for all the numbers in a code block.
;
; Bubble sort
; Here is code to apply the bubble sort operation to a code block consisting of numbers.
;
main:
{
MyData BubbleSort call
MoreData BubbleSort call
}
MyData: { 100 50 34 11 99 44 -9 }
MoreData: {
0 0 0 0 1 0 0 0 0 1 1 1 1 1 0 0 909 0 10 10 10 -9 10 10 -9
0 107 1 0 1 0 0 0 0 1 1 -1 1 1 0 0 0 808 10 10 10 -9 10 10 -9
0 0 0 110 1 0 0 0 0 1 1 1 1 1 0 770 0 0 10 10 10 -9 10 10 -9
0 -107 0 0 3200 1 0 0 0 0 1 1 1 1 -991 0 0 0 0 10 10 10 -9 10 10 -9
0 0 0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 0 10 10 10 -9 10 10 -9
}
;
; (cb n m -- cmp)
;
; compare the nth and mth elements of code block 'cb'.
;
; return 1 if elements are out of order
;
CompareElements:
{
-3 PEEK ; -- cb n m cb
swap NUMBER ; -- cb n ARRAY[m]
rot rot ; -- ARRAY[m] cb n
NUMBER ; -- ARRAY[m] ARRAY[n]
< ; -- (ARRAY[m] > ARRAY[n])
}
; (cb n m --)
; swap the nth and mth elements of code block 'cb'
;
SwapElements: {
rot ; cb n m -- n m cb
dup ; cb n m -- n m cb cb
-4 PEEK ; -- n m cb cb n
NUMBER ; -- n m cb ARRAY[n]
over ; -- n m cb ARRAY[n] cb
-4 PEEK ; -- n m cb ARRAY[n] cb m
NUMBER ; -- n m cb ARRAY[n] ARRAY[m]
-3 PEEK ; -- n m cb ARRAY[n] ARRAY[m] cb
-6 PEEK ; -- n m cb ARRAY[n] ARRAY[m] cb n
NUMBER! ; -- n m cb ARRAY[n] (array[n] = array[m])
-rot ; n m cb ARRAY[n] -- n ARRAY[n] m cb
swap ; -- n ARRAY[n] cb m
NUMBER! ; -- n (array[m] = array[n])
pop ; n --
}
;
; (cb -- )
; sort code block 'cb'
;
; implements this algorithm:
;
; bubble_sort(array, n) {
; do {
; s = 0;
; for(i=1; i < n; i++) {
; if( compare(array[i-1], array[i]) ) {
; swap(array, i-1, i)
; s = 1
; }
; }
; } while( s )
; }
;
BubbleSort: {
{
0 swap ; -- s cb (s=0)
1 ; -- s cb i (i=1)
{
over over swap ; s cb i -- s cb i i cb
CBLEN >= ?exit ; s cb i i cb -- s cb i
over over ; s cb i -- s cb i cb i
dup ; s cb i -- s cb i cb i i
1- swap ; s cb i -- s cb i cb i-1 i
CompareElements call ; -- s cb i r
{
over ; s cb i -- s cb i cb
over ; s cb i cb -- s cb i cb i
dup 1- swap ; s cb i cb i -- s cb i cb i-1 i
SwapElements call ; -- s cb i
rot ; s cb i -- cb i s
pop 1 -rot ; cb i s -- s cb i (s=1)
} if
1+ ; s cb i -- s cb i+1
1 ?loop
} call
pop ; s cb i -- s cb
swap ; -- cb s
?loop ; -- cb
} call
pop pop pop ; s cb i --
}
|