不使用内置函数对列表进行排序
Sort a list without using built-in function
我是 Tcl 的新手,正在尝试这样做:
sortList :: { 3 6 8 7 0 1 4 2 9 5 } -> { 0 1 2 3 4 5 6 7 8 9 }
这是我的代码:
set lst [list 3 6 8 7 0 1 4 2 9 5]
for {set i 0} {$i < [llength "$lst"]} {incr i} {
for {set j 0} {$j < [llength "$lst"]-1 } {incr j} {
if {[lindex $lst $j] > [lindex $lst $j+1]} {
set min [lindex $lst $j+1]
set [lindex $lst $j+1] [lindex $lst $j]
set [lindex $lst $j] $min
}
}
}
puts $lst
但它一直打印相同的列表:
3 6 8 7 0 1 4 2 9 5
我需要尽快得到帮助,谢谢。
你遇到的问题是这两行:
set [lindex $lst $j+1] [lindex $lst $j]
set [lindex $lst $j] $min
这些将更新名称恰好是小整数的变量(因为这是您列表中的内容);不是你想要的!
要修改一个列表的元素,你应该使用lset
命令:
lset list $j+1 [lindex $lst $j]
lset lst $j $min
这是因为列表是值; lset
命令改变一个变量以包含一个新列表,该列表与旧列表相同并应用了修改。它也能有效地做到这一点。
它也使代码更短。
我是 Tcl 的新手,正在尝试这样做:
sortList :: { 3 6 8 7 0 1 4 2 9 5 } -> { 0 1 2 3 4 5 6 7 8 9 }
这是我的代码:
set lst [list 3 6 8 7 0 1 4 2 9 5]
for {set i 0} {$i < [llength "$lst"]} {incr i} {
for {set j 0} {$j < [llength "$lst"]-1 } {incr j} {
if {[lindex $lst $j] > [lindex $lst $j+1]} {
set min [lindex $lst $j+1]
set [lindex $lst $j+1] [lindex $lst $j]
set [lindex $lst $j] $min
}
}
}
puts $lst
但它一直打印相同的列表:
3 6 8 7 0 1 4 2 9 5
我需要尽快得到帮助,谢谢。
你遇到的问题是这两行:
set [lindex $lst $j+1] [lindex $lst $j]
set [lindex $lst $j] $min
这些将更新名称恰好是小整数的变量(因为这是您列表中的内容);不是你想要的!
要修改一个列表的元素,你应该使用lset
命令:
lset list $j+1 [lindex $lst $j]
lset lst $j $min
这是因为列表是值; lset
命令改变一个变量以包含一个新列表,该列表与旧列表相同并应用了修改。它也能有效地做到这一点。
它也使代码更短。