箱子排序与基数排序

局部排序

箱子排序 - binsort

proc bin_sort {item_list} {

  foreach score [$item cget -score-list] {
    dict set box_slots $score [list]
  }

  foreach item $item_list {
    set score [$item cget -score]
    dict lappend box_slots $score $item
  }

  dict for {score same_items} $box_slots {
    foreach item $same_items {
      lappend result $item
    }
  }

  return $result 
}
  • binsort 是一种稳定排序 stable sort

基数排序 - radix sort

箱子排序的问题是可能需要的箱子的数目太多。对此的解决办法是「多做几遍」,每次不完全排序。

proc radix_sort {item_list score_idx} {
  if {$score_idx<0} {
    return $item_list
  }

  bin_sort $item_list [lambda {item score_idx}]
  foreach item $item_list {
    set score_list [$item cget -score-list]
    set score [lindex $score_list $score_idx]
    ...
  }

  incr score_idx -1
  return [radix_sort $result $score_idx]
}