基数排序C++实现

基数排序的基本思想

  1. 基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
  2. 基数排序的发展:(计数→桶→基数排序)
    计数排序:每个桶只存储单一键值;
    桶排序:每个桶存储一定范围的数值;
    基数排序:根据键值的每位数字来分配桶。

静态图解:

  1. 按照个位数进行排序;
  2. 按照十位数进行排序;
  3. 按照百位数进行排序,此时序列有序。

在这里插入图片描述

基数排序的算法步骤:

获取序列A最大值并确定最大位数,从个位开始,按位进行桶排序(调用基数排序子函数):

  1. 初始化10个桶bucket和临时数组result
  2. 遍历序列A,将数据出现的次数存在相应的桶bucket中;
  3. 调整桶bucket中各元素的值,调整后的值就是待排序列A中元素在result中的位置;
  4. 将待排序列元素填入result中(后入先出顺序);
  5. result全部排好后,将其复制回待排序列A

动态图解:

在这里插入图片描述

C++代码实现

#include <iostream>
#include <time.h>
using namespace std;

/*排序方法类*/
class MySort {
public:
	int n;
	int* A;
	//构造函数 ,便于挑选不同的排序方法
	MySort(int N) {
		this->n = N;
		A = new int[this->n];
		this->SetArray();
	}
	//随机初始化数组 
	void SetArray() {
		srand(time(0));
		for (int i = 0; i < n; i++) {
			A[i] = rand() % 100 + 1;
		}
	}
	//打印数组 
	void Print() {
		for (int i = 0; i < n; i++) {
			cout << A[i] << " ";
		}
		cout << endl;
	}

	//基数排序主函数
	void radixsort(int* A, int n) {
		int imax = 0;      //获取数组中的最大键值
		for (int i = 0; i < n; i++)imax = imax > A[i] ? imax : A[i];
		for (int iexp = 1; imax / iexp > 0; iexp *= 10)  
			_radixsort(A, n, iexp);    //从个位开始,对数组A按位进行基数排序
	}
	//按位排序子函数
	void _radixsort(int *A, int n, int exp) {
		int *result = new int[n];    //存放桶中收集数据后的临时数组
		int bucket[10] = { 0 };    //初始化10个桶
		//遍历A,将数据出现的次数存储在桶bucket中
		for (int i = 0; i < n; i++)
			bucket[(A[i] / exp) % 10]++;
		//调整bucket各元素的值,调整后的值就是A中元素在result中的位置
		for (int i = 1; i < 10; i++)
			bucket[i] = bucket[i] + bucket[i - 1];
		//将A中的元素填充到result中(从后往前排,先入后出)
		for (int i = n - 1; i >= 0; i--) {
			int iexp = (A[i] / exp) % 10;
			result[bucket[iexp] - 1] = A[i];
			bucket[iexp]--;
		}
		//将排序好的数组result复制回A中
		memcpy(A, result, n * sizeof(int));
	}
};

int main() {
	//初始化数组 
	int N;
	cout << "请输入数组长度:";
	cin >> N;
	MySort sort1(N);   //构造排序方法类
	cout << endl;
	cout << "基数排序前:";
	sort1.Print();
	sort1.radixsort(sort1.A,N);      //基数排序
	cout << "基数排序后:";
	sort1.Print();
	cout << endl;
	return 0;
}

代码验证:

在这里插入图片描述

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LiuZuqiang_3027

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值