LoginSignup
5
0

More than 3 years have passed since last update.

周回遅れで流行りのスターリンソートをJavaScriptで実装してみた

Last updated at Posted at 2019-08-02

スターリンソートとは

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でばっかり書いてしまう今日この頃・・・
コメントお待ちしております!

5
0
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0