RadixSort基数排序

算法数据结构(三十八)----DC3算法 后缀和数组 后缀数组其实代表所有的后缀字符串在排完名之后,从第0名到第7名依次写下来,这就是所谓的后缀数组 不会有相同的排名,因为长度不一样 生成后缀数组 1)暴力求解: 先生成所有的后缀字符串,复杂度O(N^2) 后缀字符串数量O(N),N个后缀字符串排序,代价O(N*logN) 2)DC3求解:O(N) 根据下标模3来分组,做了一个类似于递归的事情把这个问题快速解决,有一个前提,初始时,数组里头每个... 阅读详情

核心算法:

void RadixPass(RcdType rcd[], RcdType rcd1[], int n, int i, int count[], int pos[], int radix)
{
	//对数组rcd中记录关键字的第i位计数,计算得到起始位置数组pos
	//按照起始位置数组pos将rcd中的记录复制到数组rcd1中
	int k, j;
	for (k = 1; k <= n; k++)
		count[rcd[k].keys[i]] ++;

	pos[0] = 1;	//1为计数起始点,关键字0是第一个
	for (j = 1; j < radix; j++)
		pos[j] = count[j - 1] + pos[j - 1];

	for (k = 1; k <= n; k++) {
		j = rcd[k].keys[i];	//关键字
		rcd1[pos[j]++] = rcd[k];	//复制记录
	}
}

Status RadixSort(RcdList &L)
{
	RcdType *rcd1;
	int *count, *pos;	//count记统计第i个记录的关键字的各种取值 pos统计值为j的关键字的起始位置
	count = (int *)malloc(L.radix * sizeof(int));
	pos = (int *)malloc(L.radix * sizeof(int));
	rcd1 = (RcdType *)malloc((L.length + 1)*sizeof(RcdType));

	if (NULL == count || NULL == pos || NULL == rcd1)	return ERROR;

	int i = 0, j;
	while (i < L.digitNum) {
		for (j = 0; j < L.radix; j++)
			count[j] = 0;
		/*每趟基数排序 i++*/
		if (0 == i % 2)	//对rcd进行一趟基数排序
			RadixPass(L.rcd, rcd1, L.length, i++, count, pos, L.radix);
		else RadixPass(rcd1, L.rcd, L.length, i++, count, pos, L.radix);	//对rcd1进行一趟基数排序
	}
	/*奇数复制回去*/
	if (1 == L.digitNum % 2) {
		for (j = 1; j <= L.length; j++)
			L.rcd[j] = rcd1[j];
	}

	free(count);
	free(pos);
	free(rcd1);

	return OK;
}


测试代码:

data_structure.h

#ifndef DATA_STRUCTURE_H
#define DATA_STRUCTURE_H

#define OK 1  
#define ERROR 0  
#define TRUE 1  
#define FALSE 0

typedef int Status;
typedef int KeyType;

typedef struct
{
	KeyType *keys;
	//others members;  
}RcdType;

typedef struct
{
	RcdType *rcd;
	int length;	//顺序表长度
	int size;	//顺序表容量
	int digitNum;	//关键字位数
	int radix;	//关键字基数
}RcdList;

#endif


#include <stdio.h>
#include <stdlib.h>
#include "data_structure.h"

Status InitRcdList(RcdList &L, int digitNum, int radix, KeyType key[], int n)
{
	L.rcd = (RcdType*)malloc((n + 1)*sizeof(RcdType));
	if (L.rcd == NULL)	return ERROR;

	L.digitNum = digitNum;
	L.radix = radix;
	L.length = n;
	L.size = n + 1;

	int i, j;
	for (i = 1; i <= L.length; i++) {
		L.rcd[i].keys = (KeyType*)malloc(L.digitNum * sizeof(KeyType));
		if (L.rcd[i].keys == NULL)	return ERROR;
	}
	KeyType tKey;
	for (i = 1; i <= L.length; i++) {
		tKey = key[i - 1];
		for (j = 0; j < L.digitNum; j++) {
			L.rcd[i].keys[j] = tKey % L.radix;
			tKey /= L.radix;
		}
	}

	return OK;
}

void PrintRcdList(RcdList L)
{
	int i, j;
	for (i = 1; i <= L.length; i++) {
		for (j = 0; j < L.digitNum; j++)
			printf("%d ", L.rcd[i].keys[j]);
		printf("\n");
	}
}

int main()
{
	RcdList list;
	KeyType key[8] = { 337, 332, 132, 267, 262, 164, 260, 167 };
	InitRcdList(list, 3, 10, key, 8);

	PrintRcdList(list);

	printf("\nRadixSort:\n");
	RadixSort(list);
	PrintRcdList(list);

	system("pasue");
	return 0;
}


基数排序算法的时间复杂度为O(mn),其实n是记录数,m是关键字个数,通常m远小于n,时间复杂度可视作O(n),空间复杂度为O(n) 。


基数排序RadixSort(全网最详细) 感觉网上很多排序算法都写的不够详细,写一个最详细的过程 阅读详情

相关推荐

JAVA:实现RadixSort基数排序算法(附完整源码)

JAVA:实现RadixSort基数排序算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 520

GPU基数排序(CUDA radix sort)

GPU基数排序(CUDA radix sort) 引言:基数排序是具有固定迭代次数的排序算法, 其通过对最低位到最高位的一一比较,对数值排序。本文将介绍基数排序的并行实现方法,主要包括并行基数排序、并行合并、并行归约这三种算法。 本文全部代码连接: https://github.com/sty16/CUDA_radix_sort 1.基数排序算法 ​ 基数排序(radix so...

weixin_36709051的博客 5075

JavaScript实现RadixSort基数排序算法(附完整源码)

JavaScript实现RadixSort基数排序算法(附完整源码)Comparator.js完整源代码Sort.js完整源代码RadixSort.js完整源代码 Comparator.js完整源代码 export default class Comparator { constructor(compareFunction) { this.compare = compareFunction || Comparator.defaultCompareFunction; } static de

希望我的博客,能帮上你解决学习中工作中所遇到的问题 592

cuda中radix_sort

在second step中完全实在ScanCounters()函数中,具体分为upsweep, exclusivesum, downsweep.最终的目的是吧share memory的值修改成为下图中最右边的结果。这里的流程可能会和源码有出入,但是结果没问题。radix_sort排序是一种经典排序,在gpu上都有对其进行支持,这里主要参考cub中的实现,简单介绍一种单block的情形, 本文只适合看过源码但是没有看懂的同学。

feng__shuai的博客 867

CUDA:radixSort基数排序的实例

CUDA:radixSort基数排序的实例

希望我的博客,能帮上你解决学习中工作中所遇到的问题 580

JavaScript:实现RadixSort基数排序算法(附完整源码)

JavaScript:实现RadixSort基数排序算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 457

基数排序(Radix sort)

第一次接触基数排序是在学习后缀数组(有感兴趣的可以看一下--&gt;后缀数组)的时候,感觉和桶排序很像,时间复杂度能达到,是一种很高效的排序方法,下面就来看看基数排序是怎么进行排序的吧! 注:本文主要讲述从小到大排序,从大到小排序与之类似,如果你真的理解了基数排序,不难实现从大到小排序  排序方法: 给定一个需要进行排序的数组a和十个桶(编号从0到9),对于数组a中每个元素,先根据其个位数字...

AcTarjan的博客 676

基数排序——radix-sort

void radix_sort(int A[],int B[],int length,int d) { int i; for (i=1;i<=d;i++) { get_k(A,B,i,length,d); insert_sort(B,A,length); printf("\n\n第%d位排序完成的结果:\n\n",i); print_A(A,length); } }

基数排序RadixSort二进制的实现

基数排序RadixSort二进制的实现 基本概念:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。 基数排序的方式可以采用LSD或MSD,LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。 源码: public class RadixSort { ...

m0_46451044的博客 1088

别再只玩积木了!用乐高EV3和官方软件,手把手教你做个能巡线的小车(附完整代码)

本文详细介绍了如何利用乐高EV3套件和官方软件制作智能巡线机器人,从硬件组装到软件编程全面覆盖。通过传感器原理讲解、控制算法调试等工程化细节,帮助读者掌握机器人开发的核心理念,特别适合STEAM教育和硬件编程爱好者实践。

weixin_30776273的博客 449

AI医疗影像诊断工具2025 完整教程

本教程所述工具均为辅助诊断设备,不可替代执业医师判断。部署使用需遵守当地医疗器械管理法规。推荐开源框架组合:代码太多打包上传网盘了 自行下载。2025年的AI医疗影像诊断工具将以。

m0_60084632的博客 2029

排序算法-基数排序(RadixSort)

#include #include using namespace std; int pow10(int n) { int result = 10; if (n==0) { return 1; } for (int i = 0;i < n;i++) { result *= 10; } return result; } void radixSort(int *L,

hello556的专栏 538

怎么在豆包里做生成式引擎优化(GEO)

本文系统介绍了豆包平台生成式引擎优化(GEO)的全套方法体系。文章首先解析了豆包与传统搜索引擎的核心差异,强调其多模态理解和上下文感知特性,并指出GEO需从关键词匹配转向用户意图动态解析。随后详细阐述了GEO优化的三大核心策略:用户意图解析技术、实时内容适配框架和权威信号强化方法,配以技术实现路径和案例说明。最后提出GEO与SEO融合的未来趋势,建议企业构建统一知识库,实现全渠道声誉管理。全文包含大量实操代码和工具链指导,为企业在AI时代的内容优化提供系统解决方案。

解锁AI流量新红利!🚀 GEO优化(生成引擎优化)助您掌控AI搜索,让AI成为您的品牌最佳代言人! 2377

spark RadixSort基数排序源码实现

Spark版本2.4.0 Spark的RadixSort基数排序实现的排序容器基于一个LongArray实现。 在LongArray中,一个元素的长度为8字节,当排序的时候,将是每8个字节确定一个元素。 public static int sort( LongArray array, long numRecords, int startByteIndex, int endBy...

不说话装高手 497

零基础教你学RDMA驱动开发:从入门到精通--第6章 内存管理与DMA映射​6.2 DMA地址转换:内核dma_map_single()与硬件IOVA(I/O虚拟地址)​

本文深入探讨RDMA驱动中DMA地址转换机制,重点分析内核dma_map_single()函数与硬件IOVA的作用。主要内容包括:1)DMA地址转换的必要性,解决CPU虚拟地址与HCA设备DMA地址的空间割裂问题;2)内核DMA映射机制实现原理,涵盖无IOMMU(直接物理地址映射)和有IOMMU(IOVA转换)两种场景;3)硬件IOVA的工作流程及其与RDMA内存注册的结合;4)RDMA驱动开发中的关键问题,如缓存一致性、映射方向错误、IOVA泄漏等;5)以mlx5驱动为例的实践分析。文章强调DMA地址转换

xiaoheshang_123的博客 239

MATLAB 与 STK 互联的两种连接方式详解

批量仿真推荐使用方法一;交互分析推荐使用方法二。可以根据具体任务灵活切换,也可以同时使用两种方式,提升建模与仿真的效率。

weixin_52370774的博客 1566

基数排序 RadixSort

基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数 .

sytdsqzr的博客 428

RK3568驱动 SPI主/从 配置

RK3568 SPI 配置指南 内核配置:启用用户空间驱动(主)和从模式协议支持。 主模式:设备树设置status="okay"、max-freq及引脚复用,子节点compatible="rockchip,spidev"。 从模式:需添加spi-slave属性,子节点命名以slave@X开头。 编译烧写:修改设备树后编译内核或全量镜像,验证/dev/spidevX.Y节点。 测试:使用spidev_test工具,主模式可环回测试,从模式需与主设备通信。 (关键:从模式强制spi-slave和命名规则,频率匹

文石_2009的博客 1144

radixSort 基数排序<桶排序>

package sort; import java.util.Arrays; public class RadixSort { public static void main(String[] args) { int[] a = {5,4,3,2,1,9,8,96,75}; a = sort(a, 9, 2, 10); System.out.println(Arrays.toString(a)); } public static int[] sort(int[] a, int

qq_48974601的博客 177

大模型部署指南:SGLang 框架

本文介绍使用 SGLang 框架部署大模型

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 1611

硬件工程师笔记——运算放大电路Multisim电路仿真实验汇总

本文系统介绍了运算放大电路的基础知识及其应用。主要内容包括:1)运算放大器的基本结构、理想特性及分析方法(虚短、虚断、叠加定理);2)比例运算电路(同向、反向、差分)的工作原理与仿真分析;3)求和运算、加减运算电路的实现方法;4)积分、微分、指数和对数运算电路的基本原理;5)过零电压比较器的功能特点。通过理论分析和仿真实验,详细阐述了各类运算放大电路的输入输出特性、相位关系和增益计算,为硬件工程师提供了实用的电路设计参考。

XU157303764的博客 2480

用queue实现的基数排序RadixSort

代码是用queue实现的基数排序,其中arrlength表示数组长度,maxbit表示arr数组中int型整数的最大位数,如果maxbit=3,表示最大为3位数,即不超过999 /************************************** /* /* 函数名 : Radix Sort /* **********************************

ZkvIA的博客 1349

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Arduino步进电机库函数控制实战指南

步进电机是嵌入式运动控制的基础执行单元,其核心原理在于通过脉冲序列驱动转子按固定步距角旋转。AccelStepper等成熟库函数将底层时序、加减速曲线和多轴协同抽象为高层API,显著降低开发门槛。技术价值体现在非阻塞运行、物理参数可配置(如setMaxSpeed、setAcceleration)及简易闭环支持,广泛应用于智能小车、XY绘图仪、3D打印和云台稳定等场景。本文聚焦Arduino平台下基于AccelStepper与MultiStepper的工程化落地,涵盖接线规范、参数调优、丢步检测与多轴同步等关

weixin_33937913的博客 303

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

基数排序—RadixSort

基数排序 基数排序(桶排序)介绍: 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或 bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用 基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法 基数排序(Radix Sort)是桶排序的扩展 基数排序是 1887 年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。

跑马去追XX 269

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

基数排序_RADIXSORT

基数排序_RADIXSORT 基数排序的思想 基数排序算法实现 基于计数排序的基数排序 基于最优桶排序的基数排序 基数排序_RADIXSORT基数排序是一种基于计数排序_COUNTINGSORT或者是最优桶排序(当然也可以基于其他排序算法,只不过计数排序对于基数排序来说应该是最快的了,因为二者的拼音都是jishupaixu,哈哈)的一种可以在线性时间O(n)O(n)完成的排序算法。博主在做基数排序的

qeesung的专栏 1603

基数排序,radixSort

// radixSort,基数排序 // O(d(r+n)),稳定 #include &lt;cstdio&gt; int getDigit(int i, int d) { int val; while(d--) { val = i % 10; i /= 10; } return val; } void radixSo...

xiao酱油的博客 341
上一篇: 二分查找法两种实现方式
下一篇: 快速排序
不能说的昵称
博客等级 码龄12年 9粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值