我复制了完整的c++办基数排序的算法实现如下:
for(int i = 1;i<10;i++) {
bucket[i] +=bucket[i-1];//这句话到底是做什么的? wiki上面说是 //将tmp中的位置依次分配给每个桶 我表示还是看不懂?
}
class RadixSort {
public:
int* radixSort(int* A, int n) {
// write code here
int bucket[10] ={0};
int count = getMaxCount(A,n);
int index;
int *temp = new int[n];
for(int k = 1;k<=count;k++) {
for(int i = 0;i<10;i++) {
bucket[i] = 0;
}
for(int i = 0;i<n;i++) {
index = getValueAt(A[i],k);
bucket[index]++;
}
for(int i = 1;i<10;i++) {
bucket[i] +=bucket[i-1];//这句话到底是做什么的? wiki上面说是 //将tmp中的位置依次分配给每个桶 我表示还是看不懂?
}
for(int i = n-1;i>=0;i--) {
int pos = -- bucket[getValueAt(A[i],k)];
temp[pos] = A[i];
}
for(int i = 0;i < n; i++) {
A[i] = temp[i];
}
}
delete[] temp;
return A;
}
int getMaxCount(int* A,int n) {
int max = A[0];
int count = 1;
for(int i= 1;i<n;i++) {
if(A[i]>max) {
max = A[i];
}
}
while(max/10 > 0) {
count++;
max /= 10;
}
return count;
}
int getValueAt(int val,int pos) {
while(--pos) {
val /= 10;
}
return val%10;
}
ウィキのコードを使用して説明します。
リーリーここでコードを書き直し、議論を容易にするためにセクションにコメントを付けました。
例を示して、
10進数でソートするので、0~9までのバケットを10個用意する必要があります。data
を次のようにソートするとします。 リーリーリーリー
ここでは 1 ターンに何が起こるかについてのみ話しています。ここで、1 桁を使用して並べ替えを割り当てる最初のラウンドに進むとします。の0~9の値をすべて0にクリアします。
セクション 2count
は、整数
この段落の意味は、各データk = (data[j] / radix) % 10;
の k 番目の桁を計算します。このラウンドでは、data[j]
の 1 桁を表します。data[j]
をその 1 桁の番号に従って対応するバケットに入れることです。実際にデータを保存するためのバケットを生成しませんでしたが、対応する
data[j]
はバケットを反映します。内部にはいくつかのデータ項目があります。count
セクション 3
ここが質問者の問題です。これを理解するには、まず次の段落を理解する必要があります。ここで質問者が各バケットに対応する
リーリーcount
を加算します。0
0
)0
0
)3
3
)3
3
)4
4
)6
6
)7
7
)8
8
)9
9
)10
セクション 4
この段落は 2 番目のキーです。ここでは、
data
の最後の項目からtmp
まで順番に配置し、このラウンドの k 番目の位置に従ってソートするタスクを完了します。では、以下の分布は何を意味しますか:
リーリー実際、セグメント 3 のアクションの意味は次のように確認できます。
0
0
)0
0
)3
3
)3
3
)4
4
)6
6
)7
7
)8
8
)9
9
)10
次のものが見つかります:
original count
はバケット内のデータの量を表し、バケットに割り当てられるtmp
インデックスfinal count
は、バケット内のデータに割り当てられた最大インデックスに 15 番のバケットを例にとると、25 と 35 を含む 2 つの数値が
そのため、この段落の最後の数字から開始し (最初は 35、次に 25)、35 はtmp
の最初の 6 (final count
) の位置を占めるため、6
、4
、 はそれぞれ5
の 25 と 35 の位置です。tmp
(5)、次に
セクション 5count[k]-1
に配置され、25 はcount[k]--
(4) に配置されます。 。count[k]-1
のデータを
結論tmp
にコピーして戻し、このラウンドの並べ替えを完了しますdata
私が回答した質問: Python-QA