【基数排序的思想】
首先使用基数r=10进行分解,将每个整数分成d位(d是待排元素中的最大位数),每位的取值范围是0~9;因为每一位有10种可能的情况,所以建立10个链表,即lists[0]~list[9],分别代表相应位为0、1、2、3、4、5、6、7、8、9。然后执行下列步骤:
(1)第一趟:按照个位数,将元素放入相应链表中,若元素的个数为0,则放入链表lists[0]中,若元素的个数为1,则放入链表lists[1]中………………;然后按照链表的顺序(lists[0]->list[1]->list[2]………….)将链表中的元素重新拿出来,此时全部元素已经按个位排好序。
(2)第二趟:将(1)得到的整数序列按照十位数,将元素放入相应链表中,若元素的十数为0,则放入链表lists[0]中,若元素的十数为1,则放入链表lists[1]中………………;然后按照链表的顺序(lists[0]->list[1]->list[2]………….)将链表中的元素重新拿出来,此时全部元素也按十位排好序。
.
.
.
.
总共进行d趟排序。
经过d趟排序后,此时所有元素的每一位都排好序,即所有元素有序。
【代码实现】
#include<iostream>
#include<list>
using namespace std;
int maxdigit(int data[],int n)
{
int d=1;
int p=10;
for(int i=0;i<n;i++)
{
while(data[i]>=p)
{
p=p*10;
d++;
}
}
return d;
}
void radixsort(int data[],int n)
{
int digits=maxdigit(data,n);
list<int> lists[10]; //基数为10,定义10个链表
//---依次按个位、十位、百位....进行排序----
for(int d=1,factor=1;d<=digits;factor*=10,d++)
{
//-----元素进链表----
for(int j=0;j<n;j++)
{
lists[(data[j]/factor)%10].push_back(data[j]); //根据元素的相应位进链表
}
//---把链表里的元素重新拿出来---
int k=0;
for(int j=0;j<10;j++)
{
while(!lists[j].empty())
{
data[k]=lists[j].front();
lists[j].pop_front();
k++;
}
}
//---查看中间结果----
cout<<"第"<<d<<"趟结果:";
for(int i=0;i<n;i++)
{
cout<<data[i]<<" ";
}
cout<<endl;
}
}
int main()
{
int data[10]={170, 201, 45, 2, 789, 4, 456, 56, 8, 47};
radixsort(data,10);
cout<<"排序结果:";
for(int i=0;i<10;i++)
{
cout<<data[i]<<" ";
}
cout<<endl;
system("pause");
return 0;
}
【程序结果】
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-11 06:15:00