基数排序

数据结构与算法(C++实现)学习笔记(八)

1.基数排序简介

       基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用。

       基数排序算法不依靠直接比较元素排序。而是采用分配式排序,单独处理元素的每一位。从最高位向最低位处理称为:最高位优先(MSD)反之称为:最低位优先(LSD)。基数排序也称为桶排序

       下面以最低位优先为例:

       (1)准备10个容器,编号0-9,对应数字0-9。 容器是有序的(按添加顺序)
       (2)然后按待排序元素的某一位上的数字(比如:个位/十位/百位)将其存放到对应容器中(数字相同,如: 个位是数字1时, 就把这个元素放在1号桶),所有元素这样处理完后,再从0号容器开始依次到9号容器, 将其中的元素顺序取出放回原数组,然后再从下一位开始…(比如个位处理完后, 再处理十位/百位....最高位)

       下图是两位数的基数排序的动画演示

2.代码实现

#include
#include
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 *= 10;//100?1000?三位,四位
			++d;
		}
	}
	return d;
}
void Radixsort(int data[], int n)//基数排序
{
	list list[10];
	int digit = maxdigit(data, n);
	int i, factor, j, k;
	for (i = 1, factor = 1; i <= digit; factor *= 10, ++i)
	{
		for (j = 0; j < n; ++j)
		{
			list[(data[j] / factor) % 10].push_back(data[j]);
		}
		for (j = k = 0; j < 10; ++j)
		{
			while (!list[j].empty())//链表非空
			{
				data[k++] = list[j].front();//复制回数组
				list[j].pop_front();//取一个删一个
			}
		}
		//中间结果
		for (int m = 0; m < n; ++m)
			cout << data[m] << " ";
		cout << endl;
	}
}
int main()
{
	int data[15] = { 3,44,38,5,47,15,36,26,27,2,46,4,19,50,48 };
	Radixsort(data, 15);
	cout << "最终结果:" << endl;
	for (int i = 0; i < 15; ++i)
		cout << data[i] << " ";
	cout << endl;
	return 0;
}

参考视频及文章:

https://www.bilibili.com/video/av31763085/?p=22 

https://www.jianshu.com/p/8340dfaea3af

 

你可能感兴趣的:(基数排序)