implemented quick sort, ported the repl to run on the ct vm and added some more optimizations
This commit is contained in:
31
tests/quick_sort.expected
Normal file
31
tests/quick_sort.expected
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
1
|
||||||
|
3
|
||||||
|
5
|
||||||
|
7
|
||||||
|
9
|
||||||
|
42
|
||||||
|
1
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
5
|
||||||
|
6
|
||||||
|
9
|
||||||
|
10
|
||||||
|
20
|
||||||
102
tests/quick_sort.sl
Normal file
102
tests/quick_sort.sl
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
import ../stdlib/stdlib.sl
|
||||||
|
import ../stdlib/io.sl
|
||||||
|
import ../stdlib/arr.sl
|
||||||
|
|
||||||
|
# Get element from static array, preserving the array pointer
|
||||||
|
# [*, arr | i] -> [*, arr | value]
|
||||||
|
word aget
|
||||||
|
over swap arr_get_static
|
||||||
|
end
|
||||||
|
|
||||||
|
# Set element in static array, preserving the array pointer
|
||||||
|
# [*, arr, value | i] -> [* | arr]
|
||||||
|
word aset
|
||||||
|
rot dup >r -rot arr_set_static r>
|
||||||
|
end
|
||||||
|
|
||||||
|
# Swap elements at indices i and j in a static array
|
||||||
|
# [*, arr, i | j] -> [* | arr]
|
||||||
|
word arr_swap
|
||||||
|
>r >r
|
||||||
|
0 rpick aget
|
||||||
|
swap
|
||||||
|
1 rpick aget
|
||||||
|
0 rpick aset
|
||||||
|
swap
|
||||||
|
1 rpick aset
|
||||||
|
rdrop rdrop
|
||||||
|
end
|
||||||
|
|
||||||
|
# Lomuto partition (ascending, signed comparison)
|
||||||
|
# [*, arr, lo | hi] -> [*, arr | pivot_index]
|
||||||
|
word partition
|
||||||
|
>r >r
|
||||||
|
1 rpick aget
|
||||||
|
>r
|
||||||
|
1 rpick dec
|
||||||
|
1 rpick
|
||||||
|
while dup 2 rpick < do
|
||||||
|
2 pick over aget nip
|
||||||
|
0 rpick <=
|
||||||
|
if
|
||||||
|
swap inc swap
|
||||||
|
2 pick 2 pick 2 pick arr_swap drop
|
||||||
|
end
|
||||||
|
inc
|
||||||
|
end
|
||||||
|
drop inc
|
||||||
|
over over 2 rpick arr_swap drop
|
||||||
|
rdrop rdrop rdrop
|
||||||
|
end
|
||||||
|
|
||||||
|
# Recursive quicksort
|
||||||
|
# [*, arr, lo | hi] -> [* | arr]
|
||||||
|
word qsort_rec
|
||||||
|
over over >= if
|
||||||
|
drop drop
|
||||||
|
else
|
||||||
|
>r >r
|
||||||
|
0 rpick 1 rpick
|
||||||
|
partition
|
||||||
|
over 0 rpick
|
||||||
|
2 pick dec
|
||||||
|
qsort_rec
|
||||||
|
drop
|
||||||
|
over swap inc
|
||||||
|
1 rpick
|
||||||
|
qsort_rec
|
||||||
|
drop
|
||||||
|
rdrop rdrop
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Quicksort for static arrays (in-place, ascending)
|
||||||
|
# [* | arr] -> [* | arr]
|
||||||
|
word arr_qsort
|
||||||
|
dup @ dec
|
||||||
|
dup 0 < if
|
||||||
|
drop
|
||||||
|
else
|
||||||
|
>r dup 0 r>
|
||||||
|
qsort_rec
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Print all elements of a static array, one per line
|
||||||
|
word print_arr
|
||||||
|
dup @ 0
|
||||||
|
while 2dup > do
|
||||||
|
2 pick over arr_get_static puti cr
|
||||||
|
1 +
|
||||||
|
end
|
||||||
|
2drop drop
|
||||||
|
end
|
||||||
|
|
||||||
|
word main
|
||||||
|
[ 5 3 8 1 7 2 6 4 ] arr_qsort print_arr
|
||||||
|
[ 1 2 3 4 5 ] arr_qsort print_arr
|
||||||
|
[ 9 7 5 3 1 ] arr_qsort print_arr
|
||||||
|
[ 42 ] arr_qsort print_arr
|
||||||
|
[ 3 1 4 1 5 9 2 6 5 3 ] arr_qsort print_arr
|
||||||
|
[ 20 10 ] arr_qsort print_arr
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user