Don't like ads? PRO users don't see any ads ;-)
Guest

Tcl shell sort sample

By: a guest on Apr 30th, 2012  |  syntax: TCL  |  size: 1.61 KB  |  hits: 52  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1.  
  2. set channel {stdin}
  3. set count_move 0
  4. set count_diff 0
  5.  
  6. proc shellsort { data } {
  7.         global count_move count_diff
  8.         set key 0
  9.         set increment 3
  10.  
  11. foreach arg $data {
  12.         set numbers($key) $arg
  13.         incr key
  14. }
  15.  
  16. set number [array size numbers]
  17.  
  18. while {$increment > 0} {
  19.    for {set i 0} {$i < $number} {incr i} {
  20.    set j $i
  21.    set temp $numbers($i)
  22.  
  23.    while {($j >=$increment) && ($numbers([expr $j-$increment]) > $temp)} {
  24.    set numbers($j) $numbers([expr $j - $increment])
  25.    set j [expr $j - $increment]
  26.    incr count_move
  27.    }
  28.    set numbers($j) $temp
  29.  
  30.    }
  31.  
  32. if {[expr $increment/2] != 0} {
  33.       set increment [expr $increment/2]
  34.     } elseif {$increment == 1} {
  35.       set increment 0
  36.     } else {
  37.       set increment 1
  38.     }
  39.     incr count_diff
  40. }
  41.  
  42. set out [list]
  43.  
  44. for {set i 0} {$i < $number} {incr i} {
  45.         lappend out $numbers($i)
  46. }
  47. return $out
  48. }
  49.  
  50. proc random {{range 100}} {
  51.     return [expr {int(rand()*$range)}]
  52. }
  53.  
  54. proc input { what } {
  55.  
  56. global channel
  57.  
  58. puts "$what :"
  59.  
  60. if { [ gets $channel line ] == 0 } {
  61.         puts "empty line, fuck off"
  62.         return [input $what]
  63. }
  64. if {![string is integer -strict $line]} {
  65.         puts "non number $line , go fuck yourself"
  66.         return [input $what]
  67. }
  68.         return $line
  69. }
  70.  
  71. set number_el [input "enter number of elements"]
  72. set data [list]
  73.  
  74. while { [llength $data] < $number_el } {
  75.         set d [random 500]
  76.         set data [lappend data $d]
  77. }
  78.  
  79. puts "data before sort:"
  80. foreach d $data { puts -nonewline $d\, }
  81. puts ""
  82.  
  83. set data [shellsort $data]
  84.  
  85. puts "data after sort:"
  86. foreach d $data { puts -nonewline $d\, }
  87. puts "movings: $count_move , diffs: $count_diff"