(五)、排序算法:基序排序

一、基序排序的的基本思路

       将整数分别从低位到高位进行排序,即先按照个位进行排序、再按照十位进行排序、再百位、千位、、、、、、、、

二、动态演变过程:

      以{179,208,306,93,859,984,55,9,271,33};这个数组为例:

   

三、代码和测试结果

#include <iostream>
#include <list>
using namespace std;

#define DATA_NUM (10)

//获取一个数是几位数:11是2位数,111是3位数....
size_t get_digits(const size_t & num)
{
	size_t d = 1, p = 10;

	while (num >= p)
	{
		d++;
		p *= 10;
	}

	return d;
}

//基数排序
void radix_sort(size_t data[], size_t n)
{
	size_t max_digit = 0;

	for (size_t i = 0; i < n; i++)
	{
		size_t digit = get_digits(data[i]);

		max_digit = max_digit >= digit ? max_digit : digit;  //获取最大位数
	}
	cout << "max_digit:" << max_digit << endl;

	size_t d, j, k, factor;
	list<size_t> list_arry[DATA_NUM]; //这是个list数组


	for (d = 0,factor = 1; d < max_digit; d++,factor *= 10)  //最大是几位数就循环几次
	{
		for (j = 0; j < n; j++)
		{
			list_arry[(data[j] / factor) % 10].push_back(data[j]); //将数据放到合适的桶位里
		}

		for (j = k = 0; j < DATA_NUM; j++) //将桶位中的数据放回到原来的数组当中
		{
			while (!list_arry[j].empty())
			{
				data[k++] = list_arry[j].front(); //将list中的数据放回到数组中
				list_arry[j].pop_front();        //删除掉  
			}
		}

		for (size_t m = 0; m < n; m++)
			cout << data[m] << " ";
		cout << endl;

	}
	
}



int main()
{
	size_t data[DATA_NUM] = {179,208,306,93,859,984,55,9,271,33};

	radix_sort(data, DATA_NUM);

	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_40204595/article/details/109097822