Skip to content

Commit 67c89aa

Browse files
authored
Add Bubble Sort in Tcl (#5043)
1 parent 6c488dd commit 67c89aa

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed

archive/t/tcl/bubble-sort.tcl

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
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 parseIntegerList {s} {
7+
set s [string trim $s]
8+
if {$s eq ""} {
9+
usage
10+
}
11+
12+
set tokens [split $s ","]
13+
set result {}
14+
15+
foreach token $tokens {
16+
set t [string trim $token]
17+
if {$t eq ""} {
18+
usage
19+
}
20+
if {[catch {expr {int($t)}} val]} {
21+
usage
22+
}
23+
lappend result $val
24+
}
25+
26+
if {[llength $result] < 2} {
27+
usage
28+
}
29+
return $result
30+
}
31+
32+
proc isSorted {lst} {
33+
set len [llength $lst]
34+
if {$len <= 1} { return 1 }
35+
for {set i 1} {$i < $len} {incr i} {
36+
if {[lindex $lst $i] < [lindex $lst [expr {$i - 1}]]} {
37+
return 0
38+
}
39+
}
40+
return 1
41+
}
42+
43+
proc bubbleSort {lstVar} {
44+
upvar 1 $lstVar lst
45+
set n [llength $lst]
46+
for {set i [expr {$n - 1}]} {$i > 0} {incr i -1} {
47+
set swapped 0
48+
for {set j 0} {$j < $i} {incr j} {
49+
set a [lindex $lst $j]
50+
set b [lindex $lst [expr {$j + 1}]]
51+
if {$a > $b} {
52+
# swap elements
53+
lset lst $j $b
54+
lset lst [expr {$j + 1}] $a
55+
set swapped 1
56+
}
57+
}
58+
if {!$swapped} {
59+
break
60+
}
61+
}
62+
}
63+
64+
proc formatList {lst} {
65+
set out ""
66+
set n [llength $lst]
67+
for {set i 0} {$i < $n} {incr i} {
68+
if {$i > 0} { append out ", " }
69+
append out [lindex $lst $i]
70+
}
71+
return $out
72+
}
73+
74+
if {$argc != 1} {
75+
usage
76+
}
77+
78+
set raw [lindex $argv 0]
79+
set numbers [parseIntegerList $raw]
80+
81+
if {![isSorted $numbers]} {
82+
bubbleSort numbers
83+
}
84+
85+
puts [formatList $numbers]

0 commit comments

Comments
 (0)