Skip to content

Commit 88cdba3

Browse files
authored
Add Insertion Sort in Tcl (#5061)
1 parent beed923 commit 88cdba3

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed

archive/t/tcl/insertion-sort.tcl

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
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+
12+
set result {}
13+
foreach token $tokens {
14+
set t [string trim $token]
15+
if {$t eq "" || [catch {expr {int($t)}} val]} usage
16+
lappend result $val
17+
}
18+
return $result
19+
}
20+
21+
proc isSorted {lst} {
22+
set prev [lindex $lst 0]
23+
foreach x [lrange $lst 1 end] {
24+
if {$x < $prev} {return 0}
25+
set prev $x
26+
}
27+
return 1
28+
}
29+
30+
proc insertionSort {lstVar} {
31+
upvar 1 $lstVar lst
32+
set n [llength $lst]
33+
if {$n <= 1} {return}
34+
35+
set findInsertPos [list {lst key high} {
36+
set low 0
37+
incr high -1
38+
while {$low <= $high} {
39+
set mid [expr {($low + $high) / 2}]
40+
if {[lindex $lst $mid] < $key} {
41+
incr low
42+
} else {
43+
incr high -1
44+
}
45+
}
46+
return $low
47+
}]
48+
49+
for {set i 1} {$i < $n} {incr i} {
50+
set key [lindex $lst $i]
51+
52+
if {$key >= [lindex $lst [expr {$i - 1}]]} {
53+
continue
54+
}
55+
56+
set pos [apply $findInsertPos $lst $key $i]
57+
58+
set before [lrange $lst 0 [expr {$pos - 1}]]
59+
set middle [list $key]
60+
set after [lrange $lst $pos [expr {$i - 1}]]
61+
set rest [lrange $lst [expr {$i + 1}] end]
62+
63+
set lst [concat $before $middle $after $rest]
64+
}
65+
}
66+
67+
proc formatList {lst} { return [join $lst ", "] }
68+
69+
if {$argc != 1} { usage }
70+
71+
set numbers [parseList [lindex $argv 0]]
72+
73+
if {![isSorted $numbers]} {
74+
insertionSort numbers
75+
}
76+
77+
puts [formatList $numbers]

0 commit comments

Comments
 (0)