- 接下来,跟着我的思路走,你也可以实现它。如下面代码,我先定义了一个数组,然后求出来了它的个数。然后就进入基数排序。
int main()
{
int arr[10] = { 278,109,63,930,589,183,505,269,83,8 };
int n = sizeof(arr) / sizeof(int);
for (int i = 0; i < n; i++)
{
cout << arr[i] << " ";
}
cout << endl;
//基数排序
RadixSrot(arr, 0, n);
for (int i = 0; i < n; i++)
{
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
下面是源码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <queue>
using namespace std;
#define K 3
#define RADIX 10
//定义基数 构造了10个int的队列
queue<int> Q[RADIX];
//value : 278
//k =0 的时候 就得到8 k=1 就得到7
int GetKey(int value, int k)
{
int key = 0;
while (k >= 0)
{
key = value % 10;
value /= 10;
k--;
}
return key;
}
//k代表了第几次分发数据
void Distribute(int arr[],int left,int right,int k)
{
for (int i = left;i < right; i++)
{
int key = GetKey(arr[i], k);
Q[key].push(arr[i]);
}
}
void Collect(int arr[])
{
int k = 0;
for (int i = 0; i < RADIX; i++)
{
while (!Q[i].empty())
{
arr[k++] = Q[i].front();
Q[i].pop();
}
}
}
void RadixSrot(int arr[],int left,int right) //[left,right)
{
for (int i = 0; i < K; i++)
{
//分发数据
Distribute(arr, left, right, i);
//回收数据
Collect(arr);
}
}
int main()
{
int arr[10] = { 278,109,63,930,589,183,505,269,83,8 };
int n = sizeof(arr) / sizeof(int);
for (int i = 0; i < n; i++)
{
cout << arr[i] << " ";
}
cout << endl;
//基数排序
RadixSrot(arr, 0, n);
for (int i = 0; i < n; i++)
{
cout << arr[i] << " ";
}
cout << endl;
return 0;
}