分配排序——基数排序
C++
#include <iostream>
#define N 10
using namespace std;
// 求待排序序列最大元素位数,例如124最大元素位数为3
int MaxBit(int A[], int n)
{
// 初始化最大元素为A[0],最大位数为0
int maxValue = A[0], digits = 0;
// 求最大值
for (int i = 1; i < n; i++)
{
if (A[i] > maxValue) maxValue = A[i];
}
// 分解得到最大元素的位数
while (maxValue!=0)
{
digits++;
maxValue /= 10;
}
return digits;
}
// 求x第bit位上的数字,如238第2位上的数字为3
int BitNumber(int x, int bit)
{
int temp = 1;
for (int i = 1; i < bit; i++)temp *= 10;
return (x / temp) % 10;
}
void RadixSort(int A[], int n)
{
int i, j, k, b, bMax;
bMax = MaxBit(A, n); // 求最大元素位数
// 分配空间
int** B = new int* [10]; // 十个桶0,1...9
// 为每个桶分配空间,B[i][0]统计第i个桶的元素个数
for (i = 0; i < 10; i++) B[i] = new int[n + 1];
for (i = 0; i < 10; i++)B[i][0] = 0;
// 从个位到高位,对不同的位数进行桶排序
for (b = 1; b <= bMax; b++)
{
for (j = 0; j < n; j++) // 分配
{
int num = BitNumber(A[j],b);// 取A[j]第b位上的数字
int index = ++B[num][0]; // 桶内数字索引
B[num][index] = A[j];
}
for (i = 0,j = 0; i < 10; i++) // 收集:先入先出
{
for (k = 1; k <= B[i][0]; k++)
A[j++] = B[i][k];
B[i][0] = 0; // 收集后元素个数置零
}
}
//释放空间
for (int i = 0; i < 10; i++) delete[]B[i];
delete []B;
}
int main()
{
int numbers[N] = { 23,12,41,55,56,62,98,96,79,87 };
RadixSort(numbers, N);
for (int i = 0; i < N; i++)
cout << numbers[i] << " ";
cout << "\n";
return 0;
}
python
def maxBit(A):
digits = 0
maxValue = max(A)
while maxValue != 0:
digits += 1
maxValue //= 10
return digits
def bitNumber(x, bit):
temp = 1
for i in range(1, bit):
temp *= 10
return int((x / temp) % 10)
def radixSort(A, n):
bit_max = maxBit(A)
for b in range(1, bit_max + 1):
buckets = [[] for _ in range(10)] # 10个桶
for j in range(n): # 收集
num = bitNumber(A[j], b) # 取A[j]第b位上的数字
buckets[num].append(A[j])
j = 0
for i in range(10): # 分配
length = len(buckets[i])
A[j:j + length] = buckets[i]
j += length
if __name__ == '__main__':
r = [4, 23, 12, 41, 55, 56, 62, 98, 96, 79, 87]
radixSort(r, len(r))
print(r)