『アルゴリズム導論』8.3基数ソート
基数ソート:古いカードリーダーに使用されるアルゴリズムです.1枚のカードは80列あり、各列は12位置のいずれかで穿孔することができる.並べ替え器は機械的に「プログラム化」されて、1枚のカードの各列を検査し、穿孔の位置に応じて12の例に分けることができる.これにより、オペレータは、1番目の位置が最も上に穿孔され、2番目の位置が穴を穿孔された次など、1つずつ収集することができる.
10進数の場合、シリーズでは10個の位置しか使用されません.1つのdビット数がd列を占有する.カードソート器は一度に1つの列しか表示できないため、n枚のカードのd倍数をソートするにはソートアルゴリズムが必要です.
基数ソートアルゴリズムのコードは直感的である.次のプロセスでは、長さnの配列Aにおいて、各要素にはdビット数があり、そのうち第1ビットは最低ビットであり、第dビットは最高ビットであると仮定する.
RADIX-SORT(A, d)
C++実装では、プログラムが並べ替えられる数値の桁数を同じにする必要がなく、より大きな適用範囲を持つように、補助関数int maxDigit(int*arr,int digit)を使用して、並べ替えられる配列の中で最大の数桁を計算しました.
基数ソートのアルゴリズムは直感的である.1つの配列では、各要素にdビット数があり、そのうち1番目は最低ビット、d番目は最高ビットである.各位置のソートを順番に判断します.基数ソートには、別の安定したソートアルゴリズム(stable sort)が必要である.
10進数の場合、シリーズでは10個の位置しか使用されません.1つのdビット数がd列を占有する.カードソート器は一度に1つの列しか表示できないため、n枚のカードのd倍数をソートするにはソートアルゴリズムが必要です.
基数ソートアルゴリズムのコードは直感的である.次のプロセスでは、長さnの配列Aにおいて、各要素にはdビット数があり、そのうち第1ビットは最低ビットであり、第dビットは最高ビットであると仮定する.
RADIX-SORT(A, d)
for i ← 1 to d
do use a stable sort to sort array A on digit i
C++実装では、プログラムが並べ替えられる数値の桁数を同じにする必要がなく、より大きな適用範囲を持つように、補助関数int maxDigit(int*arr,int digit)を使用して、並べ替えられる配列の中で最大の数桁を計算しました.
基数ソートのアルゴリズムは直感的である.1つの配列では、各要素にdビット数があり、そのうち1番目は最低ビット、d番目は最高ビットである.各位置のソートを順番に判断します.基数ソートには、別の安定したソートアルゴリズム(stable sort)が必要である.
#include <iostream>
using namespace std;
//
int maxDigit(int* arr,int digit)
{
int n = 0;
int* temp = new int[digit];
for(int i = 0; i < digit; i++)
temp[i]= arr[i];
for(int i = 0; i < digit; i++)
{
int counter =1;
while(temp[i] / 10 > 0)
{
counter++;
temp[i] /= 10;
}
if(n < counter)
n = counter;// 。
}
delete[] temp;
return n;
}
//
void radixSort(int* arr, int digit)
{
int n = maxDigit(arr, digit);
int* temp = new int[digit];
int* count = new int[10];
int i, j, k;
int radix = 1;
for(i = 1; i <= n; i++)
{
for(j = 0; j < 10; j++)
count[j] = 0;
for(j = 0; j < digit; j++)
{
k = (arr[j] / radix) % 10;
count[k]++;
}
for(j = 1; j < 10; j++)// 。。 。。。
count[j] = count[j-1] + count[j];
for(j = digit - 1; j >= 0; j--)
{
k = (arr[j] / radix) % 10;
count[k]--;
temp[count[k]] = arr[j];
}
for(j = 0; j < digit; j++)
arr[j] = temp[j];
radix *= 10;
}
delete[] temp;
delete[] count;
}
int main()
{
int a[] = {22, 34, 95, 87, 56, 980, 12, 48};
radixSort(a, 8);
for(int i = 0; i < 8; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}