【C/C++ 06】基数排序

基数排序是桶排序的一种,算法思路为:

  1. 利用队列进行数据收发
  2. 创建一个队列数组,数组大小为10,每个元素都是一个队列,存储取模为1~9的数
  3. 从低位到高位进行数据收发,完成排序
  4. 适用于数据位不高的情况(若不知道数据集的最大位数,则只能往大了猜,降低效率)

基数排序是不稳定排序算法,时间复杂度为O(K*n),K为数据最大位数,也可表示为O(n)

虽然基数排序有着非常优秀的效率,甚至比快排还快,但是由于算法受限于数据的位数,因此并不常见。

代码示例,假设测试数据数组元素最大位数为3:

#define _CRT_SECURE_NO_WARNINGS 1

#include 
#include 
using namespace std;

// 数据最大位数
#define K 3		

// 取模的类别数(桶数、基数)
#define RADIX 10

// 桶
queue _q[RADIX];

// 获取val值对应桶的位置,即哈希映射
int GetPos(int a, int k)
{
	int pos = a % RADIX;
	while (k--)
	{
		a /= RADIX;
		pos = a % RADIX;
	}
	return pos;
} 

// 分发数据,将数组数据按模分发到哈希桶上
void Distribute(int* arr, int left, int right, int k)
{
	for (int i = left; i < right; ++i)
	{
		int pos = GetPos(arr[i], k);
		_q[pos].push(arr[i]);
	}
} 

// 收集数据,根据队列的特性从哈希桶上收集数据,存入数组
void Collect(int* arr)
{
	int pos = 0;
	for (int i = 0; i < RADIX; ++i)
	{
		while (!_q[i].empty())
		{
			arr[pos++] = _q[i].front();
			_q[i].pop();
		}
	}
} 

void RadixSort(int* arr, int n)
{
	int k = 0;
	while (k < K)
	{
		Distribute(arr, 0, n, k++);
		Collect(arr);
	}
} 

/*----------测试模块---------- */

// 打印数组
void PrintArr(int* arr, int n)
{
	for (int i = 0; i < n; ++i)
	{
		printf("%4d", arr[i]);
	} 
	cout << endl;
} 

void TestRadixSort()
{
	cout << "基数排序:";
	int arr[20] = {
		112, 23, 5, 17, 129, 0, 211, 4, 61, 8,
		511, 51, 25, 10, 210, 111, 3, 5, 18, 6
	};
	RadixSort(arr, 20);
	PrintArr(arr, 20);
} 

int main()
{
	TestRadixSort();
	return 0;
}

运行结果:

你可能感兴趣的:(C/C++,c语言,c++,开发语言)