Vim script でクイックソート

そういえば、クイックソートって書いたことがないんだよなーって事で Vim script で簡単に書いてみた。

[ソース]

function! s:quick_sort(seq)
    if a:seq == []
        return []
    endif
    
    let pivot_pos = len(a:seq) / 2
    let pivot = a:seq[ pivot_pos ]
    let left  = s:quick_sort(filter(copy(a:seq), "v:val <  pivot"))
    let right = s:quick_sort(filter(copy(a:seq), "v:val >= pivot && v:key != pivot_pos"))
    return left + [pivot] + right
endfunction


function! s:main()
    let list = [3, 6, 4, 9, 1, 5, 2, 8, 0, 7]
    echo s:quick_sort(list)
    echo s:quick_sort([])
    echo s:quick_sort([1])
    echo s:quick_sort([2, 1])
    echo s:quick_sort([2, 2, 2, 2])
    echo s:quick_sort([2, 2, 2, 4, 4, 1, 1, 6, 4, 2, 9, 9])
endfunction
call s:main()

[出力]

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[]
[1]
[1, 2]
[2, 2, 2, 2]
[1, 1, 2, 2, 2, 2, 4, 4, 4, 6, 9, 9]


copy() が邪魔や…。