回答(途中) with Concurrent Clean
[id:lethevert:20070124:p2]
配列を、何らかの方法でソートしてから比較すれば・・・と思ったけれど、ある程度かいてから、その何らかというものが容易でないということに気づいてそのアプローチを断念。
とりあえず、書きかけのコード。
module Main import StdInt, StdArray, StdOverloaded, StdClass, StdEnum , OptBase swap i j arr | i==j = arr = swap arr where swap arr=:{[i]=ai,[j]=aj} # (l,arr) = usize arr = swap_edge (dec l) {arr & [i]=aj,[j]=ai} swap_edge -1 arr = arr swap_edge k arr=:{[k]=ak} | ak == i = swap_edge (dec k) {arr & [k]=j} | ak == j = swap_edge (dec k) {arr & [k]=i} = swap_edge (dec k) arr sort_first arr = case find_root 0 arr of (i,arr) = swap 0 i arr where find_root k arr=:{[k]=ak} | k == ak = (k,arr) = find_root ak arr sort_rest l p i arr | i>=l = arr # (i,arr) = find_child i i arr = sort_rest l (inc p) i arr where find_child i k arr | k>=l = (i,arr) # (ak,arr) = arr![k] | p==ak # arr = swap i k arr = find_child (inc i) (inc k) arr = find_child i (inc k) arr sort arr # (l,arr) = usize arr = arr |> sort_first |> sort_rest l 0 1 /* test */ Start = sort tree tree :: *{#Int} tree = {1,1,9,4,9,6,9,9,0,0}