線形時間で整数を「ほぼソート」する
私は、線形時間で正の整数値配列をソートすることに興味があります(均一なコスト尺度を持つRAMモデル、つまり、整数は対数サイズまで持つことができますが、それらの算術演算は単位時間)。もちろん、これは比較ベースのソートアルゴリズムでは不可能であるため、「近似」ソートの計算、つまり、順列計算に興味がありますは本当に一般的にソートされていないが、のソートバージョンの「良い近似」。続編の記述が少し楽になるので、整数を降順でソートしていると仮定しますが、もちろん問題を逆に表現することもできます。L=v1,…,vnL=v1,…,vnL = v_1, \ldots, v_nvσ(1),…,vσ(n)vσ(1),…,vσ(n)v_{\sigma(1)}, \ldots, v_{\sigma(n)}LLLLLL 近似ソートの1つの可能な基準は次のとおりです(*):をとし、ごとに、(つまり、 「準ソート済み」リストは、上から減少関数によって制限されます。実際のソートがこれを満たしていることは簡単にわかりますは以下でなければならないため、最大ではであり、一般には以下でなければなりませんであるNNN∑ivi∑ivi\sum_i v_i1≤i≤n1≤i≤n1 \leq i \leq nvσ(i)≤N/ivσ(i)≤N/iv_{\sigma(i)} \leq N/ii↦N/ii↦N/ii \mapsto N/ivσ(2)vσ(2)v_{\sigma(2)}vσ(1)vσ(1)v_{\sigma(1)}(vσ(1)+vσ(2))/2(vσ(1)+vσ(2))/2(v_{\sigma(1)} + v_{\sigma(2)})/2≤N/2≤N/2\leq N/2vσ(i)vσ(i)v_{\sigma(i)}(∑j≤ivσ(i))/i(∑j≤ivσ(i))/i(\sum_{j \leq i} v_{\sigma(i)})/i≤N/i≤N/i\leq N/i。 たとえば、要件(*)は、以下のアルゴリズムによって実現できます(@Louisが推奨)。私の質問は次のとおりです。実際のソートが満たす(*)などの要件を課すことにより、線形時間で整数を「ほぼソート」するこのタスクに関する既存の作業はありますか?以下のアルゴリズム、またはそのバリアントには、確立された名前がありますか? 編集:アルゴリズムを修正し、説明を追加しました アルゴリズム: INPUT: V an array of size n containing positive integers OUTPUT: T N = Σ_{i<n} V[i] Create n buckets indexed by 1..n …