スターリンソートとは
Qiitaで同様のタグを見てみるとよくわかると思います。
私の認識では
ソートされていないデータがあったらその要素を除去(粛清)することで、
要素をソート(できてなくない?!)するというものらしいです・・・。
これは本当にソートなのか?!(汗)
参考
実装の際にサンプルにしたのは、スターリンソートの提唱者?っぽい人のソースコードです。
GitHubに色々公開されていました。
// 引用元 https://github.com/gustavo-depaula/stalin-sort/blob/master/javascript/stalin-sort.js
function stalinSort(array) {
// if (!Array.isArray(array)) throw new TypeError('Argument must be an Array!');
let [holder] = array;
return array.filter((el, i) => {
if (i === 0) return true;
if(el >= holder) {
holder = el;
return true;
}
return false;
});
}
ふむふむ・・・なるほど?わからん
JavaScriptでワンライナー実装♪
let myStalinSort = (arr) => ((arr, tmp = arr[0]) => { return arr.filter((v) => !(tmp > v) ? tmp = v : false)})(arr)
@htsign 様にご指摘いただいてtmpを宣言する場所を変更しました。。。。
ありがとうございます。
結果確認
確認用コードは以下の通り。(テストデータはQiitaにある色々な記事から参考にさせていただきました)
const data = []
const pattern1 = [1, 2, 1, 1, 4, 3, 9] // answer: [1 ,2 ,4 ,9]
const pattern2 = [1 ,3 ,4 ,2 ,3 ,7 ,3 ,9] // answer: [1 ,3 ,4 ,7 ,9]
const pattern3 = [6 ,2 ,5 ,7 ,3 ,8 ,8 ,4] // answer: [6 ,7 ,8 ,8]
data.push(pattern1)
data.push(pattern2)
data.push(pattern3)
// 引用元 https://github.com/gustavo-depaula/stalin-sort/blob/master/javascript/stalin-sort.js
function stalinSort(array) {
// 参考にのせたやつ・・・
}
let myStalinSort = (arr) => ((arr, tmp = arr[0]) => { return arr.filter((v) => !(tmp > v) ? tmp = v : false)})(arr)
data.map((arr) => {
const purged = myStalinSort(arr)
const answer = stalinSort(arr)
console.log(purged, answer, `result: ${purged.toString() == answer.toString()}`)
})
結果
$ node ./app.js
[ 1, 2, 4, 9 ] [ 1, 2, 4, 9 ] 'result: true'
[ 1, 3, 4, 7, 9 ] [ 1, 3, 4, 7, 9 ] 'result: true'
[ 6, 7, 8, 8 ] [ 6, 7, 8, 8 ] 'result: true'
あっていそうですね!
解説
なんとかワンライナーにしたかったので、以下の工夫を入れています。
- 即時実行関数を生成し、
tmp
変数の初期化をその中で実施しています -
!(tmp > v) ? tmp = v : false
- JavaScriptの特性を利用しています。。。
-
tmp = v
はtrueが返ります。
node
> console.log(tmp = 100) // 100が返る?!
100
undefined
> console.log(!!(tmp = 100)) // 0やemptyではないのでtrue
true
undefined
最後に
他の言語でもやってみたいけど、JavaScriptがササっと書けるからついついJSでばっかり書いてしまう今日この頃・・・
コメントお待ちしております!