基数排序是首先按最低有效位数字进行排序,以解决卡片排序问题。
重复对所有的d位数字都进行排序,仅需要d遍就可以将一堆卡片进行排序。
这里又运用了基数排序的方法,所以总的时间复杂度为O(n*d)。
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <cmath>
using namespace std;
void CountSort(int a[], int b[],int num,int d) //计数排序
{
int* c = new int[10];
int index;
for (int i=0;i<=9;i++)
c[i]=0;
int size = num;
for (int j=0;j<size;j++)
{
index=a[j]%(int)pow(10.0,d)/(int)pow(10.0,d-1);
c[index]++;
}
//c[i]包含等于i的元素个数
for (i=1;i<=9;i++)
c[i]=c[i]+c[i-1];
//c[i]包含小于等于i的元素个数
for (j=size-1;j>=0;j--)
{
index=a[j]%(int)pow(10.0,d)/(int)pow(10.0,d-1);
b[c[index]-1]=a[j];
c[index]--;
}
for (j=0;j<size;j++) //更新一次排序后的a数组
{
a[j]=b[j];
}
delete [] c;
}
void RadixSort(int a[],int b[],int d,int num) //基数排序
{
for(int i=1;i<=d;i++)
CountSort(a,b,num,i);
}
void main()
{
int num,d;
cout<<"输入个数及位数"<<endl;
cin>>num>>d;
int* a = new int[num];
int* b = new int[num];
cout<<"排序前:"<<endl;
for(int i=0;i<num;i++)
{
cin>>a[i];
}
RadixSort(a,b,d,num);
cout<<"排序后:"<<endl;
for (int j=0;j<num;j++)
{
cout<<b[j]<<endl;
}
delete [] a;
delete [] b;
}