基点算法的思想,是将相关联的数据,拆成某种特定的单元,然后对单元排序。
算法的核心点在于两个:拆和单元排序。
拆成何种结构,这个需要特定场景,但是拆出来后一定能单元排序
单元排序则是实际排序的算法,差异比较大。
本例中处理的是三位数的排序,故拆成3个个位数就好,单元排序采用的是计数排序
#include<iostream>
int getDigit(int A, int index)//获取A在index位置的数字,由低位到高位
{
int temp = pow(10, index);
temp = A / temp;
return temp % 10;
}
void ArraySort(int *A, int count, int index)//按照第index位排序,这里用的是计数算法
{
int *C = new int[10];
int *B = new int[count];
memset(C, 0, sizeof(int) * 10);
for (int i = 0; i < count; i++)
{
C[getDigit(A[i], index)] ++;
}
for (int i = 1; i < 10; i++)
{
C[i] += C[i - 1];
}
for (int i = count - 1; i >= 0; i--)
{
B[C[getDigit(A[i], index)] - 1] = A[i];
C[getDigit(A[i], index)] = C[getDigit(A[i], index)] - 1;
}
for (int i = 0; i < count; i++)
{
A[i] = B[i];
}
delete[] B;
delete[] C;
}
void RadixSort(int *A, int count, int d)
{
for (int i = 0; i < d; i++)
{
ArraySort(A, count, i);
}
}
int main()
{
int A[7] = { 329, 457, 657, 839, 436, 720, 355 };
RadixSort(A, 7, 3);
int b = 0;
}