八大排序算法-基数排序

2023-11-11

基数排序(radix sort)

定义:

属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用。 

分类:

最高位优先(Most Significant Digit first)法,简称MSD法:先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。
最低位优先(Least Significant Digit first)法,简称LSD法:先从kd开始排序,再对kd-1进行排序,依次重复,直到对k1排序后便得到一个有序序列。

基数排序基本思想:

第一步
以LSD为例,假设原来有一串数值如下所示:
73, 22, 93, 43, 55, 14, 28, 65, 39, 81
首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:
0
1 81
2 22
3 73 93 43
4 14
5 55 65
6
7
8 28
9 39
第二步
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
81, 22, 73, 93, 43, 14, 55, 65, 28, 39
接着再进行一次分配,这次是根据十位数来分配:
0
1 14
2 22 28
3 39
4 43
5 55
6 65
7 73
8 81
9 93
第三步
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
14, 22, 28, 39, 43, 55, 65, 73, 81, 93
这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。

时间效率[1]:设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radix)),其中,一趟分配时间复杂度为O(n),一趟收集时间复杂度为O(radix),共进行d趟分配和收集。 
空间效率:需要2*radix个指向队列的辅助空间,以及用于静态链表的n个指针。

算法:

#include "stdafx.h"
#include "iostream"
int arr[] = { 35, 28, 58, 10, 61, 58, 97, 17 };
int k = sizeof(arr) / sizeof(arr[0]);

int maxbit(int data[], int n) //辅助函数,求数据的最大位数
{
	int d = 1; //保存最大的位数
	int p = 10;
	for (int i = 0; i < n; ++i)
	{
		while (data[i] >= p)
		{
			p *= 10;
			++d;
		}
	}
	return d;
}
void radixsort(int data[], int n) //基数排序
{
	int d = maxbit(data, n);
	int *tmp = new int[n];
	int *count = new int[10]; //计数器
	int i, j, k;
	int radix = 1;
	for (i = 1; i <= d; i++) //进行d次排序
	{
		for (j = 0; j < 10; j++)
			count[j] = 0; //每次分配前清空计数器
		for (j = 0; j < n; j++)
		{
			k = (data[j] / radix) % 10; //统计每个桶中的记录数
			count[k]++;
		}
		for (j = 1; j < 10; j++)
			count[j] = count[j - 1] + count[j]; //将tmp中的位置依次分配给每个桶
		for (j = n - 1; j >= 0; j--) //将所有桶中记录依次收集到tmp中
		{
			k = (data[j] / radix) % 10;
			tmp[count[k] - 1] = data[j];
			count[k]--;
		}
		for (j = 0; j < n; j++) //将临时数组的内容复制到data中
			data[j] = tmp[j];
		radix = radix * 10;
	}
	delete[]tmp;
	delete[]count;
}

int _tmain(int argc, _TCHAR* argv[])
{
	radixsort(arr, k);
	for (int f = 0; f < k; f++)
	{
		std::cout << arr[f] << "  ";
	}
	getchar();
	return 0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

八大排序算法-基数排序 的相关文章

  • 微信小程序开发--2.6onLoad() 和onShow()的区别

    1 onLoad 页面第一次加载时触发 从跳转页面返回时不能触发 可以传递参数 代码示例 onLoad function options console log options console log options id var id o
  • SQL注入---联合注入

    Union联合注入攻击 1 联合注入的思路 会显示输出内容时 才考虑使用Union注入 可以在输入框中或者 URL 中输入内容 如果不能在输入框内输入内容 则需要使用 Burp suite 使用 重发器 修改 id 中的内容进行爆破数据 l
  • C++中实现Stack

    栈的实现 栈 示例代码 开发环境 运行结果 栈 栈本着先进后出的原则 来存取数据 作为数据结构中的一种 这里不多介绍相关栈 仅以此文记录C 中栈的实现 可帮助提升编程能力与对栈的理解 示例代码 直接上代码 SeqStack h pragma

随机推荐

  • Windows密码破解

    这里主要介绍两种方法来破解Windows的开机密码 一 利用五次shift漏洞来对win7 win10进行破解 此方法只适用于win7或者早期的win10 此方法主要是利用Windows开机时默认按五次shift键会启用粘贴键程序如下图 我
  • 手动推导LogisticRegression建模结果

    usr bin env python3 coding UTF 8 Date 2023 8 25 15 51 Author HELIN import numpy as np from sklearn model selection impor
  • 如何从Windows切换到Linux

    作者 栈栈 链接 CU技术社区 微软已经马上准备在2020年1月份终止对Windows 7的支持 这意味着您将不再获得bug修复或安全更新 如果您是Windows 7的最终支持者之一 并且不想陷入一个不安全的系统 则可以选择 升级到Wind
  • Verilog功能模块——Uart收发

    摘要 本文分享了一种通用的Uart收发模块 可实现Uart协议所支持的任意波特率 任意位宽数据 5 8 任意校验位 无校验 奇校验 偶校验 1校验 0校验 任意停止位 1 1 5 2 的数据传输 此模块需要搭配FIFO使用 以消除发送端和接
  • 最新AI创作系统ChatGPT网站源码+详细图文搭建教程/支持GPT-4/支持AI绘画/Prompt应用/访客体验功能

    一 SparkAI创作系统 如何搭建部署AI创作ChatGPT系统呢 小编这里写一个详细图文教程吧 SparkAi使用Nestjs和Vue3框架技术 持续集成AI能力到AIGC系统 1 1 程序核心功能 程序已支持ChatGPT3 5 4
  • Python:安装Flask web框架hello world示例

    安装easy install pip install distribute 安装pip easy install pip 安装 virtualenv pip install virtualenv 激活Flask pip install Fl
  • 搭建私人图床结合内网穿透实现公网访问,让您的摄影作品连接世界

    文章目录 1 树洞外链网站搭建 1 1 下载安装树洞外链 1 2 树洞外链网页测试 1 3 cpolar的安装和注册 2 本地网页发布 2 1 Cpolar临时数据隧道 2 2 Cpolar稳定隧道 云端设置 2 3 Cpolar稳定隧道
  • Select、Poll、Epoll的使用和区别,多种IO的区别

    目录 一 四种IO分类 二 I O多路复用select 三 I O多路复用Poll 四 I O多路复用Epoll 五 三种多路复用的区别总结 1 支持一个进程所能打开的最大连接数 2 fd剧增后带来的IO效率问题 3 消息传递方式 4 索引
  • 一、PyTorch基础:Tensor基础操作

    1 1Tensor Tensor 又名张量 读者可能对这个名词似曾相识 因它不仅在PyTorch中出现过 它也是Theano TensorFlow Torch和MxNet中重要的数据结构 关于张量的本质不乏深度的剖析 但从工程角度来讲 可简
  • SQL注入-报错注入

    页面没有显示位 但有数据库的报错信息时 可使用报错注入 报错注入是最常用的注入方式 也是使用起来最方便 我觉得 的一种注入方式 updatexml 1 3 第二个参数包含特殊字符时 数据库会报错 并将第二个参数的内容显示在报错内容中 返回结
  • 机器学习——特征工程(3分钟的超详细介绍)

    目录 1 什么是特征工程 2 数据预处理和特征处理 2 1 数据预处理 2 2 特征处理 3 特征降维 3 0 什么是特征降维 3 1 特征选择 3 2 线性降维 3 2 1 主成分分析法 PCA 3 2 2 线性判别分析法 LDA 1 什
  • 使用ESCAPE处理模糊查询%的问题

    前言 在模糊查询时 如果要查询的内容中有 比例 小明 如果不做处理 那么就会查询到所以的小明相关的数据 不能只查询到小明 的数据 1 创建工具类 工具类 public class StringUtils private static fin
  • QT关于QGIS3.26的二次开发

    目录 1 使用平台以及版本 2 显示一张tif格式的图片 3 代码的具体分析 4 一点基础知识 5 其他代码 1 使用平台以及版本 VS 2022 编译器MSVC2019 QT版本 5 15 2 系统 win10 QGIS版本 3 26 9
  • Raspberry系统管理 —— 安装和配置OpenVINO

    文章目录 什么是OpenVINO 下载测试用例 加速自己的模型 什么是OpenVINO OpenVINO Open Visual Inference and Neural Network Optimization 是一个用于视觉推理和神经网
  • 【计算机视觉

    文章目录 一 2D open vocabulary object detection的发展和研究现状 二 基于大规模外部图像数据集 2 1 OVR CNN Open Vocabulary Object Detection Using Cap
  • PyQt学习笔记-信号与槽

    PyQt学习笔记 信号与槽 一 基本概念 二 编辑信号与槽 三 自定义槽 四 将自定义的槽函数连接到信号 五 多窗口设计 1 设置启动窗口 2 窗口之间的关联 一 基本概念 信号与槽是Qt的核心机制 也是PyQt5编程时对象之间通信的基础
  • JDBC操作MySQL5日期类型字段的问题解决方法

    JDBC操作MySQL5日期类型字段的问题解决方法 由于日期数据的特殊性和多样性 以及不同的数据库 编程语言对日期的定义和处理方式差别 导致了日期处理的复杂性 和多样性 流行的Hibernate iBatis等持久化框架从中解决了各种Jav
  • Flutter之数据库的使用(sqflite_common_ffi)

    sqflite是Flutter的SQLite插件 支持的平台有 iOS Android MacOS 桌面端可以使用sqflite common ffi 本篇文章以sqflite common ffi为主 sqflite common ffi
  • m2增长率曲线_中国m2历年数据曲线图_中国m2历年数据

    2012年5月经济数据 搜狐财经 580x400 39KB JPEG 李彦宏 有图有真相 移动互联网时代真的结束了 693x390 130KB PNG 图1 全国主要城市分用途地价环比增长率曲线图 540x248 36KB JPEG 美元强
  • 八大排序算法-基数排序

    基数排序 radix sort 定义 属于 分配式排序 distribution sort 又称 桶子法 bucket sort 或bin sort 顾名思义 它是透过键值的部份资讯 将要排序的元素分配至某些 桶 中 藉以达到排序的作用 分