先看完上一篇桶排,再看此篇会简单很多。
#include<iostream>
#include<cstdlib>#include<ctime>
#include<string.h>
#define TYPE int
#define MAX_LENGTH 50 //测试数据长度
#define MAX_A 10 //每多少位排序,此处是1位。 为方便描述:设每m位排序 例: 12345 按1位排序: 1 2 3 4 5 先按个位排序,再按十位,依此类推
// 按2位排序 1 23 45 先按个位和十位数排序,再百位和千位,依此类推
using namespace std;
int main()
{
TYPE Array[MAX_LENGTH];
TYPE TempArray[MAX_A];
TYPE TA[MAX_LENGTH];
TYPE MAX = -1;//记录数组中最大值
srand(time(NULL));
for (int i = 0; i < MAX_LENGTH; i++)
{
Array[i] = rand() % 1000;
if (MAX < Array[i])
MAX = Array[i];
}
for (int i = 0; i < MAX_LENGTH; i++)
cout << Array[i] << " ";
cout << endl;
int n=0;
while (MAX) //求得最大值的位数
{
n++;
MAX /= 10;
}
int Radix = 1;
for (int k = 1; k <= n; k++)
{
memset(TempArray, 0, sizeof(TempArray)); //将临时数组TempArray置0
for (int i = 0; i < MAX_LENGTH; i++) //记录数量()
TempArray[(Array[i] / Radix) % MAX_A]++;
for (int i = 1; i < MAX_A; i++) //累加数量,为后面将数字放入的位置做准备
TempArray[i] += TempArray[i - 1];
for (int i = MAX_LENGTH - 1; i >= 0; i--) //按排序后的数组放入对应的位置 注意此处排序只是将每m位排序后的结果 特别注意:要保证算法的稳定性,所以倒序遍历
TA[--TempArray[(Array[i] / Radix) % MAX_A]] = Array[i];
for (int i = 0; i < MAX_LENGTH; i++) //将结果放回Array数组
Array[i] = TA[i];
Radix *= 10;
}
for (int i = 0; i < MAX_LENGTH; i++)
cout << Array[i] << " ";
cout << endl;
return 0;
}
本文详细介绍了位数排序算法的基本概念、原理,并通过C++代码实例展示了具体实现过程。从生成测试数据到求解最大数值位数,再到进行多轮排序直至最终排序完成,全程采用位数作为排序依据,确保了排序的高效性和稳定性。
1477

被折叠的 条评论
为什么被折叠?



