基数排序算法

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


//计数排序
//计数排序假设每个元素都是在0到max之间的一个整数。
//基数排序的基本思想,对于每个元素x,如果我们知道了小于x的元素的个数,就可以确定输出数组中元素x的位置,那么直接将元素x放到输出数组中。比如有3小于x的元素,那在输出数组中,x肯定位于第4个位置。
//时间复杂度为:T(n)=O(max+n),因此当k小于等于n,也就是当max=O(n),max和n同阶时,采用计数排序的时间复杂度为T(n)=O(n)
//计数排序也是一种稳定的排序算法。
void CountSort(vector<int> &vec)  
{
	int max = -1;  //求出vec中最大的数,那么所有的数都是在[0,max]区间中,可能会有max+1个不同的数
	for (int i = 0; i <= vec.size() - 1; i++)
	{
		if (max < vec[i])
		{
			max = vec[i];
		}
	}

	vector<int> count(max+1);  //初始化max+1个值为0的数,用以在vec每个元素对应位置上保存自身出现的次数
	for (int i = 0; i <= vec.size() - 1; i++)   统计vec[j]元素出现的次数,保存到count计数数组中  
	{
		count[vec[i]]++;
	}
	for (int i = 1; i <= count.size() - 1; i++)  // 统计小于或等于每个元素的个数 
	{
		count[i] = count[i] + count[i - 1];
	}

	vector<int> temp(vec.size());
	for (int i = vec.size() - 1; i >= 0; i--)  //将每一个元素暂时放到temp数组中对应的位置上
	{
		temp[count[vec[i]] - 1] = vec[i];
		count[vec[i]]--;  //由于有可能有相同元素存在,所以,每次将vec[i]元素放入B数组中,都要将vec[i]的个数减一,这样当遇到下一个值等于vec[i]的元素时,该元素就能放在输出数组中vec[i]的前面
	}

	for (int i = 0; i <= vec.size() - 1; i++)  //复制到vec中用以返回
	{
		vec[i] = temp[i];
	}
}


//基数排序
//如果基数排序使用的稳定排序算法的时间复杂度为O(n + k),要循环d轮,每轮耗时为O(n + k),那么基数排序的时间复杂度为T(n) = O(d(n + k))
//稳定排序
void sort(vector<int> &vec)
{
	int bit_max = 1;  //求所有数中的最大位
	int flag = 10;
	for (int i = 0; i <= vec.size() - 1; i++)
	{
		while (vec[i] >= flag)  //如果遇到大于flag的数,就求这个数的最高位
		{
			flag *= 10;
			bit_max++;
		}
	}

	flag = 1;  //从低位开始比较
	for (int i = 1; i <= bit_max; i++)  //对每一位上的所有数据依次进行计数排序,共bit_max趟排序
	{
		vector<int> count(10);  //每个位上的数字都在[0,9]区间中
		for (int j = 0; j <= vec.size() - 1; j++)  //统计此位上所有数的次数保存在count数组的对应数的对应位置上
		{
			int k = (vec[j] / flag) % 10;
			count[k]++;
		}
		for (int j = 1; j <= count.size() - 1; j++)  //统计此位上小于或等于每个元素的数的个数
		{
			count[j] = count[j] + count[j - 1];
		}
		vector<int> temp(vec.size());
		for (int j = vec.size()-1; j >= 0; j--)  //将数组中的每一个元素按此位上的数字顺序摆放在temp数组中
		{
			int k = (vec[j] / flag) % 10;
			temp[count[k]-1] = vec[j];
			count[k]--;   //由于有可能有相同元素存在,所以,每次将vec[i]元素放入B数组中,都要将vec[i]的个数减一,这样当遇到下一个值等于vec[i]的元素时,该元素就能放在输出数组中vec[i]的前面
		}
		for (int j = 0; j <= vec.size() - 1; j++)
		{
			vec[j] = temp[j];
		}
		flag *= 10;  //升高位数比较
	}
}

int main()
{
	vector<int> vec = { 3,7,8,2,1,4,6,11,25 };
	for (unsigned int i = 0; i <= vec.size() - 1; i++)
	{
		cout << vec[i] << " ";
	}
	cout << endl;
	sort(vec);
	for (unsigned int i = 0; i <= vec.size() - 1; i++)
	{
		cout << vec[i] << " ";
	}

	system("pause>nul");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值