您的位置:首页 > 编程语言 > C语言/C++

排序算法之基数排序

2012-12-21 21:43 204 查看
基数排序,利用计数排序思想,对数据分别按位数进行计数排序,时间复杂度O(n·k); 需要 O(n) 额外空间,是稳定的排序

#include<iostream>
using namespace std;
void RadixCountSort(int A[], int k, int len)//分别为需排序的数组,排序的基数,数组的长度
{
int *C = new int[k]();//计数排序所需临时空间,初始化为0
int *nDataRadix = new int[len];//储存基数
int *ntempRadix = new int[len];	//储存每次排序后的数组(计数排序使用)
int i,RadixBase=1,IsOk;
while(true)
{
IsOk = 1;//排序完成标志位置1
for(i=0;i<k;i++)//对计数排序的临时空间清0
C[i]=0;
for(i=0;i<len;i++)//将当前基数存入nDataRadix数组
{
if(IsOk!=0&&A[i]/RadixBase!=0)//当不是所有数据都已判断完成时,标志位置0,当标志位已被置0时不再判断
IsOk=0;
nDataRadix[i]=A[i]/RadixBase%10;
}
if(IsOk)//标志位为1则退出循环
break;
/*对基数进行计数排序,或其他稳定排序*/
for(i=0;i<len;i++)
++C[nDataRadix[i]];
for(i=1;i<k;i++)
C[i]+=C[i-1];
for(i=len-1;i>=0;i--)
{
--C[nDataRadix[i]];
ntempRadix[C[nDataRadix[i]]]=A[i];
}
for(i=0;i<len;i++)//将按当前基数排好的顺序返回
{
A[i]=ntempRadix[i];
}
RadixBase*=k;//基数移至下一位
}
delete []C;
delete []nDataRadix;
delete []ntempRadix;
}

int main()
{
int nData[10] = {123,5264,9513,854,9639,1985,159,3654,8521,8888};
RadixCountSort(nData,10,10);
for (int i = 0; i < 10; ++i)
{
cout<<nData[i]<<"--";
}
cout<<endl;
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 排序算法