//基于计数排序的基数排序
//输入中数组从1开始计数
#include <iostream>
#include <cstring>
const int N=1000;
using namespace std;
const int scale=10;
int power(int digit) //位数幂运算
{
if(digit==1) return 1;
int value=1;
for(int i=2;i<=digit;i++) value=value*scale;
return value;
}
int calculate(int a,int digit) //计算a在digit位的值
{
return (a/power(digit))%10;
}
int search(int A[],int length,int digit)
{
int max=calculate(A[1],digit);
for(int i=1;i<=length;i++)
{
max=(max>calculate(A[i],digit)?max:calculate(A[i],digit));
}
return max;
}
void COUNTING_SORT(int A[],int length,int k,int digit)
{
int TEMP[N];
memset(TEMP,0,sizeof(TEMP));
int B[N];
for(int i=1;i<=length;i++) TEMP[calculate(A[i],digit)]++;
for(int i=1;i<=k;i++) TEMP[i]=TEMP[i]+TEMP[i-1];
for(int i=length;i>0;i--) //为了使计数排序保持稳定性,若i从1到length的话,不能保持其稳定性
{
B[TEMP[calculate(A[i],digit)]]=A[i];
TEMP[calculate(A[i],digit)]--;
}
for(int i=1;i<=length;i++)
{
A[i]=B[i];
}
}
void RADIX_SORT(int A[],int length,int digit)
{
for(int i=1;i<=digit;i++)
{
int max;
max=search(A,length,digit);
COUNTING_SORT(A,length,max,digit);
}
}
int main(int argc, char *argv[])
{
int A[N];
int n; cin>>n;
int digit; cin>>digit;
for(int i=1;i<=n;i++) cin >> A[i];
for(int i=1;i<=digit;i++) RADIX_SORT(A,n,i);
for(int i=1;i<=n;i++) cout << A[i] <<ends;
cout << endl;
cout << "Hello World!" << endl;
return 0;
}
基数排序(基于计数排序)
最新推荐文章于 2020-10-19 09:56:13 发布