【ソートアルゴリズム】:カウントソート
構想:並べ替えられた配列をAとし,並べ替え後Bに格納し,Cを一時配列とする.カウントとは、まず1つの配列C[i]によってiに等しい大きさの要素の個数を計算し、この過程は1回の循環遍歴だけでよい.これに基づいて,i以下の要素個数を計算することも,一重ループで完了する.次のステップは、length[A]から1までの逆順サイクルで、A[i]をBのC[A[i]]番目の位置に配置します.原理は:C[A[i]]はa[i]以下の要素の個数を表し、ちょうどA[i]がソートされた後にあるべき位置である.またlength[A]から1逆シーケンスサイクルまでは,同じ要素間の相対順序が変わらないことが保証され,これもカウントソート安定性の体現である.配列Aにアクセサリ属性がある場合,安定性は非常に重要である.実は上のbbはそんなに多くて、道理はとても簡単で、1つのrangの大きさの配列を開いて、rangの範囲は配列の要素の大きさの範囲です.そして並べ替え配列に基づいて新しく開いた配列を位置++に対応させる.そしてもう一度読みます.
コード:
コード:
void CountSort(int* arr, int len)
{
assert(arr);
assert(len > 0);
int min = arr[0];
int max = arr[0];
for (int i = 1; i < len; i++)
{
if (arr[i]>max)
max = arr[i];
if (arr[i] < min)
min = arr[i];
}
int range = max - min + 1;
int* counts = new int(range);
memset(counts, 0, sizeof(int)*range);
for (int i = 0; i < len; i++)
{
counts[arr[i] - min]++;
}
int j = 0;
for (int i = 0; i < range; i++)
{
while (counts[i]--)
arr[j++] = i + min;
}
}