基础排序算法之基数排序

基本思想:桶排序的改进版, 申请的桶的内存大小固定为10,减少内存开销;

                  因为是十进制,所以每一个数值的个,十,百等中的一位,范围都是0 - 9;

如 15, 分为 个位的 5 和 十位的 1;

过程: 分配一个大小为10 的数组bucket,首先遍历源数列src中的数值的个位,在bucket中记录下数列src的每一个个位 数值的个数;再合计,最后依次放入临时数组中排序。。。;详细过程代码如下:

#include<iostream>
#include<vector>
using namespace std;
//桶排序  时间复杂度 O(x * n)
/*

*/
#define RADIX 10
void my_swap(int& first, int& second)
{
	int tmp = first;
	first = second;
	second = tmp;
}
void RadixSort(vector<int>& vec)
{
	if (vec.empty()) return;
	int max = INT_MIN;
	int len = vec.size();
	int bucket[RADIX];//桶的大小固定为10,初始化为0
	
	int* pTmp = new int[len];//临时数组
	
	for (auto val : vec)
		if (val > max) max = val;
	//先排序个位,再十位...
	for (int level = 1; max / level != 0; level *= 10)
	{
		memset(bucket, 0, sizeof(int)*RADIX);
		memset(pTmp, 0, sizeof(int)*len);
		for (int i = 0; i < len; i++)
		{
			//记录桶中 0 - 9 各个数字的个数
			bucket[vec[i] / level % 10]++;
		}
		//记录桶中各个数字(0-9)前面(包括自身),合计已有多少个
		for (int j = 1; j < RADIX; j++)
		{
			bucket[j] += bucket[j - 1];
		}
		
		//(重点)-完成上一步后, bucket中的值为1,2,3.。。这一连续值,代表的是vec数列中的值在
		//bucket中的下标
		for (int k = len - 1; k >= 0; k--)
		{
			bucket[vec[k] / level % 10]--;
			//bucket[vec[k] / level % 10] -- vec[k]这个值在bucket中排序的位置
			pTmp[bucket[vec[k] / level % 10]] = vec[k];
		}

		//重新赋值到vec
		for (int ival = 0; ival < len; ival++) {
			vec[ival] = pTmp[ival]; 
		}
	}
	
}
int main()
{
	vector<int> arr = { 12,5,9,34,3,97,63,23,53,87,120,999,1024,11,77 };
	cout << "raw val is:\n";
	for (auto i : arr)
		cout << i << "\t";
	cout << endl;

	RadixSort(arr);
	cout << "BucketSorted val is:\n";
	for (auto i : arr)
		cout << i << "\t";
	cout << endl;
	system("pause");
	return 0;
}
发布了69 篇原创文章 · 获赞 10 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/u010096608/article/details/103076900