《算法导论》的基数排序 C++实现

#include<iostream>
#include<vector>

using namespace std;

typedef struct Node{
	int data;   //数值
	int ge;		//位值
	int shi;
	int bai;
}Node;

void CountSort(vector<Node> A, vector<Node> &B, int k,int n,int bit)
{
	int i,j;
	vector<int> C(k+1, 0);
	if (bit == 0)  //先排序个位
	{
		for (i = 0; i < n; i++)
			C[A[i].ge] = C[A[i].ge] + 1;
		for (j = 1; j <= k; j++)
			C[j] = C[j] + C[j - 1];
		for (j = n - 1; j >= 0; j--)
		{
			B[C[A[j].ge]] = A[j];
			C[A[j].ge] = C[A[j].ge] - 1;
		}
	}

	if (bit == 1)  //排序十位
	{
		for (i = 0; i < n; i++)
			C[A[i].shi] = C[A[i].shi] + 1;
		for (j = 1; j <= k; j++)
			C[j] = C[j] + C[j - 1];
		for (j = n - 1; j >= 0; j--)
		{
			B[C[A[j].shi]] = A[j];
			C[A[j].shi] = C[A[j].shi] - 1;
		}
	}

	if (bit == 2)   //排序百位
	{
		for (i = 0; i < n; i++)
			C[A[i].bai] = C[A[i].bai] + 1;
		for (j = 1; j <= k; j++)
			C[j] = C[j] + C[j - 1];
		for (j = n - 1; j >= 0; j--)
		{
			B[C[A[j].bai]] = A[j];
			C[A[j].bai] = C[A[j].bai] - 1;
		}
	}
}

void RadixSort(vector<Node> &A, vector<Node> &B, int k, int n,int bit)
{
	int i;
	for (i = 0; i < bit; i++)
		CountSort(A, B, k, n,i);
}

int main(void)
{
	vector<Node> A;
	int i,ge,shi,bai;
	Node temp;
	int s[8] = { 329, 457, 657, 839, 436, 720, 355, 999 };
	vector<Node> B;	//预留空间大一点,防止边界溢出,因为C[A[j]]不会为0 B从1下标开始
	for (i = 0; i < 9; i++)
		B.push_back({ 0, 0, 0, 0 });
	for (i = 0; i < 8; i++)  //把数据添加到A中
	{
		bai = s[i] / 100;
		shi = s[i] % 100 / 10;
		ge = s[i] % 100 % 10;
		temp = { s[i], ge, shi, bai };
		A.push_back(temp);  
	}
	RadixSort(A, B, 10, 8, 3);

	for (auto i = 1; i < 9;i++)
		cout << B[i].data << " ";
	cout << endl;
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值