基数排序是非比较排序的一种,LSD是基数排序的一种,又称为最低位优先,其基本思想是先按最低位关键码的大小将元素放入一个桶中,然后取出再按次低位的大小执行前面操作,直到最高位为止。LSD的时间复杂度为O(MN)(M为最大的数的位数),空间复杂度为O(N)。
实现:
#include <vector>
int Pow(const int& left, const int& right)
{
if(right <= 0)
return 1;
int product = 1;
for(int i = 0; i < (int)right; i++)
product *= left;
return product;
}
void LSDSort(int *array, const int size)
{
assert(NULL != array && size > 0);
if(size == 1)
return;
int place = 0;
for(int i = 0; i < (int)size; i++)
{
int num = array[i];
int status = 0;
while(num)
{
status++;
num /= 10;
}
if(status > place)
place = status;
}
for(int i = 0; i < place; i++)
{
vector< vector<int> > bucket;
bucket.resize(10);
for(int j = 0; j < (int)size; j++)
bucket[(array[j]/Pow(10,i))%10].push_back(array[j]);
int index = 0;
for(int j = 0; j < 10; j++)
{
int vsize = bucket[j].size();
for(int k = 0; k < vsize; k++)
array[index++] = bucket[j][k];
}
}
}
测试代码:
void test10()
{
int arr[200] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
srand((unsigned int)time(0));
for(int i = 0; i < sz; i++) //Assign values with random numbers
{
arr[i] = rand() % sz;
}
for(int i = 0; i < sz; i++) //print array
cout << arr[i] << " ";
cout << endl << endl << endl << "sort:" << endl;
LSDSort(arr, sz); //sort
for(int i = 0; i < sz; i++) //print array
cout << arr[i] << " ";
cout << endl;
for(int i = 1; i < sz; i++) //check that the sort is correct
{
if(Less<int>()(arr[i], arr[i-1]))
cout << "sort error! " << arr[i] << endl;
}
}
排序效果: