Skip to content

Commit 09f7026

Browse files
authored
Add Merge Sort in Tcl (#5070)
1 parent ca73699 commit 09f7026

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

archive/t/tcl/merge-sort.tcl

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
proc usage {} {
2+
puts stderr {Usage: please provide a list of at least two integers to sort in the format "1, 2, 3, 4, 5"}
3+
exit 1
4+
}
5+
6+
proc parseList {s} {
7+
set tokens [split [string trim $s] ","]
8+
if {[llength $tokens] < 2} { usage }
9+
10+
set result {}
11+
foreach token $tokens {
12+
set t [string trim $token]
13+
if {$t eq "" || [catch {expr {int($t)}} val]} usage
14+
lappend result $val
15+
}
16+
return $result
17+
}
18+
19+
proc merge {lstVar tempVar left mid right} {
20+
upvar 1 $lstVar lst
21+
upvar 1 $tempVar temp
22+
23+
set i $left
24+
set j [expr {$mid + 1}]
25+
set k $left
26+
27+
while {$i <= $mid && $j <= $right} {
28+
if {[lindex $lst $i] <= [lindex $lst $j]} {
29+
lset temp $k [lindex $lst $i]
30+
incr i
31+
} else {
32+
lset temp $k [lindex $lst $j]
33+
incr j
34+
}
35+
incr k
36+
}
37+
38+
while {$i <= $mid} {
39+
lset temp $k [lindex $lst $i]
40+
incr i
41+
incr k
42+
}
43+
44+
while {$j <= $right} {
45+
lset temp $k [lindex $lst $j]
46+
incr j
47+
incr k
48+
}
49+
50+
for {set idx $left} {$idx <= $right} {incr idx} {
51+
lset lst $idx [lindex $temp $idx]
52+
}
53+
}
54+
55+
proc mergeSort {lstVar} {
56+
upvar 1 $lstVar lst
57+
set n [llength $lst]
58+
if {$n <= 1} { return }
59+
60+
set temp {}
61+
set width 1
62+
while {$width < $n} {
63+
set i 0
64+
while {$i < $n} {
65+
set left $i
66+
set mid [expr {$i + $width - 1}]
67+
if {$mid >= $n} { break }
68+
69+
set right [expr {$mid + $width}]
70+
if {$right >= $n} { set right [expr {$n - 1}] }
71+
72+
merge lst temp $left $mid $right
73+
incr i [expr {2 * $width}]
74+
}
75+
set width [expr {$width * 2}]
76+
}
77+
}
78+
79+
proc formatList {lst} { return [join $lst ", "] }
80+
81+
if {$argc != 1} { usage }
82+
83+
set numbers [parseList [lindex $argv 0]]
84+
mergeSort numbers
85+
puts [formatList $numbers]
86+

0 commit comments

Comments
 (0)