当前位置: 首页 > news >正文

c++数据结构算法复习基础--13--基数算法

基数排序 - 桶排序

时间复杂度 O(n*d) – d为数据的长度
在这里插入图片描述

每次比较一位(个位、十位。。。),所以取值范围就为0-9。
根据该特点,设计桶的概念 – 0号桶、1号桶…
在这里插入图片描述

1、思想

1)找出最长的数字,确定要处理的桶的趟数(位数)
2)依次由个位开始处理,把相应位数上的数字,放入相应序号的桶内,
完成后,再按照桶的序号,依次取出桶里面的数据,放回原始数据当中。
3)当处理完所有的位数,最终得到有序的序列。

2、局限性

1)数据类型改变,需要代码较大的修改。
对于之前的代码,如果换成浮点数等其他类型数据,大体代码思路一致。
但是基数算法不行,代码无法做到统一,需要进一步修改。
2)对于数据正负性,要求较高。
之前的代码,数据正负性影响不大,可比较即可。
对于基数排序,需要进一步堆数据进行修改。下文实现的代码,对于负数无法实现。

3、实现过程

在这里插入图片描述
1)从左到右依次遍历原始数据,先由个位开始比较。根据每个数据的个位,放入相应的桶中。一次遍历,如下图所示:
在这里插入图片描述
2)依次遍历各个桶,将其重新拷贝到原数据。
在这里插入图片描述
3)根据十位,依次放入对应桶中。
在这里插入图片描述
4)依次取出数据
在这里插入图片描述
因为此次数据最大为两位数,所以这次操作,就可以发现数据有序了。

4、核心代码:

1)循环每次取出位上的数字。

在这里插入图片描述

2)桶的定义,

需要为二维数组。使用vector<vector<int>>

4、代码实现

#include<iostream>
#include<stdlib.h> //包含随机数函数srand
#include<time.h> //需要用time作为随机数种子
#include<string>
#include<vector>//基数排序代码
void RadixSort(int arr[], int size)
{int maxData = arr[0];//求得数据最大值for (int i = 1; i < size; i++){if (maxData < arr[i]){maxData = arr[i];}}//使用系统自带的函数,求取最大值的位数int len = to_string(maxData).size();//定义桶的二维数组vector<vector<int>> vecs;//这里底层并没有空间int mod = 10;int dev = 1;//处理数据for (int i = 0; i < len; mod *= 10, dev *= 10, i++) //O(d) d为数据的长度{vecs.resize(10);for (int j = 0; j < size; j++){//得到当前元素第i个位置的数字int index = arr[j] % mod / dev;vecs[index].push_back(arr[j]);}//依次遍历所有的桶,把元素拷贝回原始的数组当中int idx = 0;for (auto vec : vecs){for (int v : vec){arr[idx++] = v;}}//清空桶内元素,方便下次使用vecs.clear();}}

测试

int main()
{int arr[10];srand(time(NULL));for (int i = 0; i < 10; i++){arr[i] = rand() % 100 + 1;}for (int v : arr){cout << v << "  ";}cout << endl;RadixSort(arr, sizeof(arr) / sizeof(arr[0]));for (int v : arr){cout << v << "  ";}cout << endl;return 0;
}

在这里插入图片描述

5、 对于有负数情况下,代码修改

1)桶,需要设计为20个。增加负数存放的位置。

vecs.resize(20);

2)求取最大值位数时,需要增加abs() – 绝对值函数

//求得数据最大值
for (int i = 1; i < size; i++)
{if (maxData < abs(arr[i])){maxData = abs(arr[i]);}
}

3) 数据的存放

取得所需位数后,再加10。
负数放于0-9的桶中,正数放于10-19的桶中。

	for (int j = 0; j < size; j++){//得到当前元素第i个位置的数字int index = arr[j] % mod / dev + 10;vecs[index].push_back(arr[j]);}

代码实现

//基数排序代码
void RadixSort(int arr[], int size)
{int maxData = arr[0];//求得数据最大值for (int i = 1; i < size; i++){//为了处理负数,使用abs(),取绝对值if (maxData < abs(arr[i])){maxData = abs(arr[i]);}}//使用系统自带的函数,求取最大值的位数int len = to_string(maxData).size();//定义桶的二维数组vector<vector<int>> vecs;//这里底层并没有空间int mod = 10;int dev = 1;//处理数据for (int i = 0; i < len; mod *= 10, dev *= 10, i++){vecs.resize(20);//20个桶,为了能处理负数 -9 --  9for (int j = 0; j < size; j++){//得到当前元素第i个位置的数字int index = arr[j] % mod / dev + 10;vecs[index].push_back(arr[j]);}//依次遍历所有的桶,把元素拷贝回原始的数组当中int idx = 0;for (auto vec : vecs){for (int v : vec){arr[idx++] = v;}}//清空桶内元素,方便下次使用vecs.clear();}}

测试

在这里插入图片描述

相关文章:

c++数据结构算法复习基础--13--基数算法

基数排序 - 桶排序 时间复杂度 O(n*d) – d为数据的长度 每次比较一位&#xff08;个位、十位。。。&#xff09;&#xff0c;所以取值范围就为0-9。 根据该特点&#xff0c;设计桶的概念 – 0号桶、1号桶… 1、思想 1&#xff09;找出最长的数字&#xff0c;确定要处理的…...

ntp设置

NTP&#xff08;Network Time Protocol&#xff09;简介 ntp授时定义 - NTP是一种用于在计算机网络中同步时间的协议。它确保网络中的各个设备&#xff08;如服务器、客户端计算机、网络设备等&#xff09;的时钟保持准确一致。 - 其工作原理是通过分层的时钟源体系&#xff…...

如何在Java中使用封装好的API接口?

1.选择合适的 HTTP 库 在 Java 中&#xff0c;可以使用多种库来进行 HTTP 请求。java.net.HttpURLConnection是 Java 标准库中的类&#xff0c;能够满足基本的 HTTP 请求需求&#xff0c;但使用起来相对复杂。另外&#xff0c;还有一些第三方库&#xff0c;如OkHttp和Apache H…...

AWS EKS 相关错误修复 - remote error: tls: internal error - CSR pending

现象 升级aws eks的kubernetes版本后执行kubectl logs 或者kubectl exec相关命令会出现报错 remote error: tls: internal error 执行kubectl get csr -A查看csr出现一直pending的状态,并且出现问题的pod都在新创建出来的eks node节点上 kubectl get csr -A NAME AGE …...

浏览器事件循环机制

JavaScript 是单线程运行的语言&#xff0c;同一时间只能执行一个任务。单线程意味着&#xff1a; 如果某个任务执行时间过长&#xff0c;后续任务会被阻塞。 同步任务和异步任务的调度需要一种机制来管理。 为了解决这个问题&#xff0c;事件循环应运而生&#xff0c;它可以…...

ubuntu22.04编译安装Opencv4.8.0+Opencv-contrib4.8.0教程

本章教程,主要记录在Ubuntu22.04版本系统上编译安装安装Opencv4.8.0+Opencv-contrib4.8.0的具体过程。 一、下载opencv和opencv-contrib包 wget https://github.com/opencv/opencv/archive/refs/tags/4.8.0.zip wget https://github.com/opencv/opencv_contrib/archive/refs/…...

概率论得学习和整理27:关于离散的数组 随机变量数组的均值,方差的求法3种公式,思考和细节。

目录 1 例子1&#xff1a;最典型的&#xff0c;最简单的数组的均值&#xff0c;方差的求法 2 例子1的问题&#xff1a;例子1只是1个特例&#xff0c;而不是普遍情况。 2.1 例子1各种默认假设&#xff0c;导致了求均值和方差的特殊性&#xff0c;特别简单。 2.2 我觉得 加权…...

【排序算法】——插入排序

目录 前言 简介 基本思想 1.直接插入排序 2.希尔排序 代码实现 1.直接插入排序 2.希尔排序 总结 1.时空复杂度 2.稳定性 尾声 前言 排序(Sorting) 是计算机程序设计中的一种重要操作&#xff0c;它的功能是将一个数据元素&#xff08;或记录&#xff09;的任意序列&…...

MySQL的并发控制与MVCC机制深度解析

目录 1. MySQL中的并发问题2. 数据库的隔离级别3. MVCC&#xff08;多版本并发控制&#xff09;机制3.1 MVCC的实现原理3.2 Read View详解3.3 当前读与快照读 4. MVCC在不同隔离级别下的工作方式5. MVCC解决幻读问题6. MVCC的优缺点优点&#xff1a;缺点&#xff1a; 7. MVCC在…...

Qt编译MySQL数据库驱动

目录 Qt编译MySQL数据库驱动 测试程序 Qt编译MySQL数据库驱动 &#xff08;1&#xff09;先找到MySQL安装路径以及Qt安装路径 C:\Program Files\MySQL\MySQL Server 8.0 D:\qt\5.12.12 &#xff08;2&#xff09;在D:\qt\5.12.12\Src\qtbase\src\plugins\sqldrivers\mysql下…...

uniapp地址类 方法

关于点击没反应 manifest.json 检查是否添加了对应的权限 /* 小程序特有相关 */"mp-weixin" : {"appid" : "wxc481f10754f1d9df","setting" : {"urlCheck" : false,"es6" : true,"postcss" : true,&qu…...

使用Idea自带的git功能进行分支合并

文章目录 1.背景描述2.分支切换3.分支合并的具体操作4.将在local环境下&#xff0c;从dev合并到qas分支上的代码&#xff0c;推送到远端 1.背景描述 目前在开发的当前项目有四个分支&#xff0c;master(主分支)、pre(预生产分支)、qas(测试分支)、dev(开发分支)&#xff1b; …...

酷盾安全:Edge SCDN边缘安全内容分发网络

在当今数字化迅猛发展的时代&#xff0c;互联网内容分发的高效与安全成为了企业不可忽视的重要课题。为了满足这一需求&#xff0c;酷盾安全推出了创新的Edge Secure Content Delivery Network&#xff08;Edge Scdn&#xff09;解决方案&#xff0c;它不仅融合了分布式DDoS防护…...

H5 中 van-popup 的使用以及题目的切换

H5 中 van-popup 的使用以及题目的切换 在移动端开发中&#xff0c;弹窗组件是一个常见的需求。vant 是一个轻量、可靠的移动端 Vue 组件库&#xff0c;其中的 van-popup 组件可以方便地实现弹窗效果。本文将介绍如何使用 van-popup 实现题目详情的弹窗展示&#xff0c;并实现…...

Liinux下VMware Workstation Pro的安装,建议安装最新版本17.61

建议安装最新版本17.61&#xff0c;否则可能有兼容性问题 下载VMware Workstation安装软件 从官网网站下载 https://support.broadcom.com/group/ecx/productdownloads?subfamilyVMwareWorkstationPro 选择所需版本 现在最新版本是17.61&#xff0c;否则可能有兼容性问题…...

WebRTC服务质量(05)- 重传机制(02) NACK判断丢包

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…...

修改ubuntu apt 源及apt 使用

视频教程:修改ubuntu apt 源和apt 使用方法_哔哩哔哩_bilibili 1 修改apt源 1.1 获取阿里云ubuntu apt 源 https://developer.aliyun.com/mirror/ubuntu?spma2c6h.13651102.0.0.3e221b11mqqLBC 1.2 修改apt 源 vim /etc/apt/sources.list deb https://mirrors.aliyun.com/ub…...

深入解析 `DataFrame.groupby` 和 `agg` 的用法及使用场景

深入解析 DataFrame.groupby 和 agg 的用法及使用场景 1. groupby 的基本用法语法&#xff1a;示例&#xff1a; 2. agg 的基本用法语法&#xff1a;示例&#xff1a; 3. first、sum、lambda 的用法3.1 first示例&#xff1a; 3.2 sum示例&#xff1a; 3.3 lambda示例&#xff…...

MySQL 的锁

MySQL有哪些锁?各种锁的作用与使用场景全局锁表级锁表锁元素锁意向锁AUTO-INC 锁 行级锁记录锁间隙锁临键锁 其他共享锁排他锁乐观锁悲观锁 MySQL有哪些锁? 全局锁表级锁 a. 表锁 b. 元素锁 c. 意向锁 d. AUTO-INC 锁行级锁 a. 记录锁 b. 间隙锁 c. 临键锁 各种锁的作用与使…...

二、使用langchain搭建RAG:金融问答机器人--数据清洗和切片

选择金融领域的专业文档作为源文件 这里选择 《博金大模型挑战赛-金融千问14b数据集》&#xff0c;这个数据集包含若干公司的年报&#xff0c;我们将利用这个年报搭建金融问答机器人。 具体下载地址 这里 git clone https://www.modelscope.cn/datasets/BJQW14B/bs_challenge_…...

别再手动调样式了!用WangEditor的Menu API在Vue3里打造你的专属工具栏

深度定制WangEditor&#xff1a;用Menu API在Vue3中构建企业级富文本生态 当我们需要在Vue3项目中集成富文本编辑器时&#xff0c;WangEditor以其轻量级和高度可定制性成为许多开发者的首选。但真正发挥其威力的关键在于深入理解其Menu API系统——这套机制允许我们突破默认功能…...

Go语言中的包管理

Go语言中的包管理 1. 包管理的基本概念 包管理是Go语言开发中的重要部分&#xff0c;它负责管理项目的依赖关系。Go语言的包管理经历了几个阶段&#xff1a; GOPATH模式vendor模式Go Modules模式&#xff08;当前推荐&#xff09; 2. Go Modules简介 Go Modules是Go 1.11引入的…...

SEO_为什么你的网站需要持续进行SEO优化?

SEO优化的重要性&#xff1a;为什么你的网站需要持续进行SEO优化 在当前竞争激烈的互联网市场中&#xff0c;网站的流量和用户参与度直接影响着企业的成功与否。为什么你的网站需要持续进行SEO优化呢&#xff1f;SEO&#xff08;搜索引擎优化&#xff09;不仅是提升网站在搜索…...

提升 10 倍的学习效率,这款浏览器必装的AI插件为什么火了?

花了3 周时间写了一个浏览器插件&#xff0c;一个月陆陆续续下载量破 1000 啦 安装链接 为什么要做这个项目&#xff1f; 一开始我入门学习 langchain 大模型agent开发&#xff0c;在之前我不懂的问题需要在 google 上搜索非常多的资料 融会贯通以后才能得到答案&#xff0…...

如何快速配置跨平台鼠标连点器:终极效率提升指南

如何快速配置跨平台鼠标连点器&#xff1a;终极效率提升指南 【免费下载链接】MouseClick &#x1f5b1;️ MouseClick &#x1f5b1;️ 是一款功能强大的鼠标连点器和管理工具&#xff0c;采用 QT Widget 开发 &#xff0c;具备跨平台兼容性 。软件界面美观 &#xff0c;操作直…...

终极指南:如何在macOS上使用Applite轻松管理Homebrew Cask应用

终极指南&#xff1a;如何在macOS上使用Applite轻松管理Homebrew Cask应用 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite Homebrew Cask是macOS用户安装第三方应用的高效工具…...

Drone-DETR实战:如何在VisDrone2019数据集上实现轻量化小目标检测(附完整代码)

Drone-DETR实战&#xff1a;轻量化小目标检测在无人机遥感图像中的应用 无人机航拍图像中的小目标检测一直是计算机视觉领域的难点。当你在处理VisDrone2019这类数据集时&#xff0c;传统检测方法往往力不从心——那些在400米高空拍摄的汽车、行人等目标&#xff0c;可能只占图…...

别再只用NodePort了!手把手教你用MetalLB在本地K8s集群实现LoadBalancer服务暴露

突破本地Kubernetes限制&#xff1a;MetalLB实现LoadBalancer全实战指南 当你第一次在本地Minikube或自建Kubernetes集群中尝试创建LoadBalancer类型的Service时&#xff0c;那个永恒的"Pending"状态是否让你感到困惑&#xff1f;云厂商提供的LoadBalancer服务在本地…...

FixPlus-v1.56.148 一键擦除,会员功能直接解锁

核心功能 AI智能擦除技术可精准识别并移除照片中的干扰元素&#xff08;如路人、杂物&#xff09;&#xff0c;自动填补背景&#xff0c;处理效果自然无痕。AI换衣功能支持智能服装替换与风格调整&#xff0c;为创意编辑提供更多可能。 操作便捷性 无需专业技巧&#xff0c;通…...

HGTector2:三小时掌握微生物基因转移检测的终极免费方案

HGTector2&#xff1a;三小时掌握微生物基因转移检测的终极免费方案 【免费下载链接】HGTector HGTector2: Genome-wide prediction of horizontal gene transfer based on distribution of sequence homology patterns. 项目地址: https://gitcode.com/gh_mirrors/hg/HGTect…...