私は数字のリストをソートすることになっていますが、私はとても怠け者です。すべての数字が昇順になるまですべての数字を入れ替える方法を考えるのは本当に難しいので、新しいリストがソートされることを保証する独自のアルゴリズムを思いついた¹。仕組みは次のとおりです。
サイズNのリストの場合、N-1回の反復が必要です。各反復で、
N番目の数値がN + 1番目の数値よりも小さいかどうかを確認します。そうである場合、これらの2つの数値は既にソートされているため、この反復をスキップできます。
そうでない場合は、最初のN個の数字を順番にデクリメントして、これら2つの数字が順番どおりになるまで続ける必要があります。
具体例を見てみましょう。入力があったとしましょう
10 5 7 6 1
最初の反復で、10と5を比較します。10は5よりも大きいため、小さくなるまでデクリメントします。
4 5 7 6 1
5と7を比較します。5は7より小さいので、この反復では何もする必要はありません。次のステップに進み、7と6を比較します。7は6より大きいため、最初の3つの数値を6未満になるまでデクリメントして、次のようにします。
2 3 5 6 1
ここで、6と1を比較します。ここでも、6は1よりも大きいため、最初の4つの数値を1より小さくなるまでデクリメントし、次のようにします。
-4 -3 -1 0 1
これで完了です!これで、リストは完全にソートされた順序になりました。さらに、さらに改善するために、リストをN-1回反復するだけで済みました。したがって、このアルゴリズムはO(N-1)時間でリストを並べ替えます。
今日の課題は、このレイジーソートを実装することです。プログラムまたは関数には、任意の標準形式の整数の配列が与えられます。この遅延ソートを実行し、新しい「ソート済み」リストを返す必要があります。配列が空になったり、整数が含まれたりすることはありません。
ここではいくつかの例を示します。
Input: 10 5 7 6 1
Output: -4 -3 -1 0 1
Input: 3 2 1
Output: -1 0 1
Input: 1 2 3
Output: 1 2 3
Input: 19
Output: 19
Input: 1 1 1 1 1 1 1 1 1
Output: -7 -6 -5 -4 -3 -2 -1 0 1
Input: 5 7 11 6 16 2 9 16 6 16
Output: -27 -25 -21 -20 -10 -9 -2 5 6 16
Input: -8 17 9 7
Output: -20 5 6 7
いつものように、これはcode-golfなので、できる限り短いプログラムを書いてください!
¹ これは、それが意味するように聞こえるものを意味するものではありませんが、技術的には真実です
² 私は完全に冗談を言っています、私を憎まないでください
<sarcasm>
このソートアルゴリズムはO(N^2)
、リスト上の以前にアクセスしたすべてのアイテムをデクリメントする必要があるため、実際には時間の複雑さを記録しています。代わりにリストを逆方向にたどって、必要に応じてステップごとに1つの数値だけを減らすことをお勧めします。これにより、真のO(N)
複雑さが得られます!</sarcasm>
O(n^2)
メモリアクセスの観点から@ValueInk O(n)
ですが、比較用ではありませんか?
O(N^2)
ます。