【基數排序的思想】
首先使用基數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;
}