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

排序---基数排序

前言

个人小记


一、简介

基数排序是一种非比较排序,所以排序速度较快,当为32位int整数排序时,可以将数分为个位十位分别为2^16,使得拷贝只需要两轮,从而达到2*n,然后给一个偏移量,使得可以对负数排序。以下是一个非正确(自以为正确)的基数排序优化和未优化的比较。(注意:这可是对1000万的数据排序!前几个排序都是10万的数据!)

二、代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_ARR 10000000
#define swap(a,b)\
{\__typeof(a) __c=a;\a=b,b=__c;\
}
#define TEST(func,arr,l,r)\
{\printf("test:%s \t",#func);\int n=r-l;\int* t=(int*)malloc(sizeof(int)*n);\long long a=clock();\func(t,l,r);\long long b=clock();\if(check(t,n))printf("OK %lldms\n",(b-a)*1000/CLOCKS_PER_SEC);\else printf("FAIL\n");\free(t);\
}int check(int *t,int n)
{for(int i=1;i<n;i++){if(t[i-1]>t[i])return 0;}return 1;
}int * init_arr(int n)
{int*arr=(int*)malloc(sizeof(int)*n);for(int i=0;i<n;i++){if(rand()%2)arr[i]=-rand()%10000000;else arr[i]=rand()%10000000;}return arr;
}
int *cont,*temp;
void PO_radix_sort(int *arr,int l,int r)
{int k=65536;//2^16memset(cont,0,sizeof(int)*k*2);for(int i=l;i<r;i++){if(arr[i]<0)cont[k+abs(arr[i]%k)]++;//理论个位else cont[arr[i]%k]++;}for(int i=1;i<k;i++)cont[i]=cont[i-1]+cont[i];for(int i=r-1;i>=l;i--){if(arr[i]<0)temp[--cont[abs(arr[i]%k)]]=arr[i];else temp[--cont[arr[i]%k]]=arr[i];}memcpy(arr+l,temp,sizeof(int)*(r-l));memset(cont,0,sizeof(int)*k*2);for(int i=l;i<r;i++){if(arr[i]<0)cont[k+abs(arr[i]/k)]++;//理论十位else cont[arr[i]/k]++;}for(int i=1;i<k;i++)cont[i]=cont[i-1]+cont[i];for(int i=r-1;i>=l;i--){if(arr[i]<0)temp[--cont[abs(arr[i]/k)]]=arr[i];else temp[--cont[arr[i]/k]]=arr[i];}memcpy(arr+l,temp,sizeof(int)*(r-l));return ;
}
void radix_sort(int *arr,int l,int r)
{int k=65536;//2^16int *cont_1=(int *)malloc(sizeof(int)*k*2);int *temp_1=(int *)malloc(sizeof(int)*(r-l));memset(cont_1,0,sizeof(int)*k*2);for(int i=l;i<r;i++){if(arr[i]<0)cont_1[k+abs(arr[i]%k)]++;//理论个位else cont_1[arr[i]%k]++;}for(int i=1;i<k;i++)cont_1[i]=cont_1[i-1]+cont_1[i];for(int i=r-1;i>=l;i--){if(arr[i]<0)temp_1[--cont_1[abs(arr[i]%k)]]=arr[i];else temp_1[--cont_1[arr[i]%k]]=arr[i];}memcpy(arr+l,temp_1,sizeof(int)*(r-l));memset(cont_1,0,sizeof(int)*k*2);for(int i=l;i<r;i++){if(arr[i]<0)cont_1[k+abs(arr[i]/k)]++;//理论十位else cont_1[arr[i]/k]++;}for(int i=1;i<k;i++)cont_1[i]=cont_1[i-1]+cont_1[i];for(int i=r-1;i>=l;i--){if(arr[i]<0)temp_1[--cont_1[abs(arr[i]/k)]]=arr[i];else temp_1[--cont_1[arr[i]/k]]=arr[i];}memcpy(arr+l,temp_1,sizeof(int)*(r-l));free(cont_1);free(temp_1);return ;
}int main()
{srand((unsigned)time(0));int *arr=init_arr(MAX_ARR);cont=(int*)malloc(sizeof(int)*65536*2);temp=(int *)malloc(sizeof(int)*MAX_ARR);TEST(radix_sort,arr,0,MAX_ARR); TEST(PO_radix_sort,arr,0,MAX_ARR); free(arr);free(cont);free(temp);return 0;
}

三、测试结果

test:radix_sort         OK 284ms
test:PO_radix_sort      OK 302ms

四、优化错误原因

1.内存局部性: radix_sort 在每次调用时都会分配新的内存,这可能意味着它使用的内存更有可能在CPU的缓存中,因为它是最近分配的。相比之下,PO_radix_sort 使用的是预先分配的全局数组,这些数组可能不在缓存中,尤其是在程序运行了其他代码之后。内存局部性差可能导致更多的缓存未命中,从而降低性能。

2.内存碎片: 如果程序在调用 PO_radix_sort 之前已经运行了一段时间,全局数组可能会在物理内存中分散开来,这增加了内存访问的开销。而 radix_sort 动态分配的内存更有可能是连续的,这有助于提高访问速度。

3.编译器优化: 动态分配的内存可能使得编译器能够更好地优化 radix_sort 函数,因为编译器知道这些内存是局部的,并且其生命周期仅限于函数调用。全局变量通常更难以优化,因为它们必须在整个程序的生命周期内保持有效。

4.多次函数调用: 如果 TEST 宏多次调用 PO_radix_sort,全局数组 cont 和 temp 不会在每次调用之间清除或重新初始化,这可能导致性能下降。而 radix_sort 每次调用都会得到新的内存,这确保了每次排序都是从一个干净的状态开始的。

5.内存分配策略: 操作系统的内存分配策略可能也会影响性能。例如,某些系统可能会更快地分配大块内存,而其他系统可能在处理多个小的分配时更有效率。

相关文章:

排序---基数排序

前言 个人小记 一、简介 基数排序是一种非比较排序&#xff0c;所以排序速度较快&#xff0c;当为32位int整数排序时&#xff0c;可以将数分为个位十位分别为2^16,使得拷贝只需要两轮&#xff0c;从而达到2*n&#xff0c;然后给一个偏移量&#xff0c;使得可以对负数排序。以…...

“新高考”下分班怎么分?

来自安徽的张女士告诉我&#xff1a;上一年孩子升入了高中&#xff0c;但没想到才高一&#xff0c;孩子就面临了一个困难的挑选&#xff1a;312”分班&#xff01; 什么是312”分班呢&#xff1f;许多人或许不明白&#xff0c;便是要求学生在高一入学时&#xff0c;针对于3门必…...

二叉树的层序遍历-力扣

本题是二叉树的层序遍历&#xff0c;通过一个队列来控制遍历的节点&#xff0c;二叉树每层的节点和上一层入队的节点个数是相同的&#xff0c;根据这一点编写循环条件。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …...

N32G45XVL-STB之移植LVGL(lvgl-8.2.0)

目录 概述 1 软硬件介绍 1.1 软件版本信息 1.2 ST7796-LCD 1.3 MCU IO与LCD PIN对应关系 2 认识LVGL 2.1 LVGL官网 2.2 LVGL库文件下载 3 移植LVGL 3.1 准备移植文件 3.2 添加lvgl库文件到项目 3.2.1 src下的文件 3.2.2 examples下的文件 3.2.3 配置文件路径 3.2…...

【设计模式】创建型设计模式之 原型模式

介绍 原型模式是一种创建型设计模式&#xff0c;主要用于创建重复的对象&#xff0c;而无需重新初始化它们&#xff0c;从而提高效率并简化对象的创建过程。此模式的核心思想是利用已存在的对象实例&#xff0c;通过复制&#xff08;克隆&#xff09;的方式来生成新的对象&…...

【类型商店】字符字符串(下)

啊&#xff0c;哈喽&#xff0c;小伙伴们大家好。我是#Y清墨&#xff0c;今天呐&#xff0c;我要介绍的是字符与字符串。 导语 前两期&#xff0c;我们已经懂得了概念&#xff0c;今天来看些函数。 正题 一.增加或连接 &#xff08;1) 后面增加() string s1,s2; //定义 s…...

『 Linux 』内存管理与文件系统

文章目录 交换分区页与页框(页帧)交换分区与内存之间的交换操作系统如何管理内存物理地址转换页号与页内偏移量 内存管理,文件系统与文件管理之间的联系 交换分区 在Linux的安装过程中,用户将会被提示创建一个交换分区; 这是一个特殊的分区,其大小可以由用户根据系统内存需求和…...

线性代数|机器学习-P8矩阵低秩近似eckart-young

文章目录 1. SVD奇异值分解2. Eckart-Young2.1 范数 3. Q A Q U Σ V T QAQU\Sigma V^T QAQUΣVT4. 主成分分析图像表示 1. SVD奇异值分解 我们知道&#xff0c;对于任意矩阵A来说&#xff0c;我们可以将其通过SVD奇异值分解得到 A U Σ V T AU\Sigma V^T AUΣVT&#xff0…...

平面设计神器CorelDRAW2021精简版,你值得拥有!

亲爱的设计师小伙伴们&#xff0c;今天我要为大家种草一款神奇的软件——CorelDRAW平面设计软件2021精简版&#xff01;&#x1f929;✨作为一名专业的图形设计师&#xff0c;我深知一个好工具对于我们的工作有多么重要。而这款软件简直就是我们设计师的救星&#xff01;&#…...

kafka是什么?

Kafka是一个由Apache软件基金会开发的开源流处理平台&#xff0c;最初由LinkedIn公司开发&#xff0c;使用Scala和Java编写。它是一个高吞吐量的分布式发布订阅消息系统&#xff0c;可以处理消费者在网站中的所有动作流数据&#xff0c;如网页浏览、搜索和其他用户行为等。Kafk…...

ABC351

C 栈的应用 #include<bits/stdc.h>using namespace std;stack<int>stk;int main() {int n;cin>>n;for(int i1;i<n;i){int a;cin>>a;while(!stk.empty()&&astk.top()){stk.pop();a;}stk.push(a);}cout<<stk.size()<<endl;retur…...

base上海,数据科学,数据挖掘,数据分析等岗位求收留

裁员了&#xff0c;base上海&#xff0c;数据科学&#xff0c;数据挖掘&#xff0c;数据分析等岗位&#xff0c;期望30k~40k&#xff0c;求推荐求收留 1&#xff0c;6年数据算法工作&#xff0c;做过指标体系搭建&#xff0c;用户画像&#xff0c;货品定价&#xff0c;社区分析…...

IC元器件

1.电阻&#xff1a; 电阻的作用&#xff1a; 1.与负载串联&#xff1a;做限流分压 2.电阻并联&#xff1a;将小功率电阻并联成大功率&#xff0c;防烧毁 2.电容&#xff1a; 电容就是两块金属板&#xff0b;中间的介质&#xff08;相当于两个人坐在一起加上中间的空气…...

SQL159 每个创作者每月的涨粉率及截止当前的总粉丝量

描述 用户-视频互动表tb_user_video_log iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id110120012021-09-01 10:00:002021-09-01 10:00:20011NULL210520022021-09-10 11:00:002021-09-10 11:00:30101NULL310120012021-10-01 10:00:002021-10-01 10:00…...

Linux安装MySQL教程【带图文命令巨详细】

巨详细Linux安装MySQL 1、查看是否有自带数据库或残留数据库信息1.1检查残留mysql1.2检查并删除残留mysql依赖1.3检查是否自带mariadb库 2、下载所需MySQL版本&#xff0c;上传至系统指定位置2.1创建目录2.2下载MySQL压缩包 3、安装MySQL3.1创建目录3.2解压mysql压缩包3.3安装解…...

外部排序快速入门详解:基本原理,败者树,置换-选择排序,最佳归并树

文章目录 外部排序1.最基本的外部排序原理2.外部排序的优化2.1 败者树优化方法2.2 置换-选择排序优化方法2.3 最佳归并树 外部排序 为什么要学习外部排序&#xff1f; 答&#xff1a; 在处理数据的过程中&#xff0c;我们需要把磁盘(外存&#xff09;中存储的数据拿到内存中处理…...

人工智能和物联网如何结合

欢迎来到 Papicatch的博客 目录 ​ &#x1f349;引言 &#x1f349;AI与IoT的结合方式 &#x1f348;数据处理和分析 &#x1f34d;实例 &#x1f348;边缘计算 &#x1f34d;实例 &#x1f348;自动化和自主操作 &#x1f34d;实例 &#x1f348;安全和隐私保护 &…...

【JAVASE】JAVA应用案例(下)

一&#xff1a;抢红包 一个大V直播时&#xff0c;发起了抢红包活动&#xff0c;分别有9,666,188,520,99999五个红包。请模拟粉丝来抽奖&#xff0c;按照先来先得&#xff0c;随机抽取&#xff0c;抽完即止&#xff0c;注意&#xff1a;一个红包只能被抽一次&#xff0c;先抽或…...

【面试干货】 B 树与 B+ 树的区别

【面试干货】 B 树与 B 树的区别 1、B 树2、 B 树3、 区别与优缺点比较4、 总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在数据库系统中&#xff0c;B 树和 B 树是常见的索引结构&#xff0c;它们在存储和组织数据方面有着不同的设计…...

Socket编程权威指南(四)彻底解密 Epoll 原理

在上一篇文章中&#xff0c;我们优化了基于 Socket 的网络服务器&#xff0c;从最初的 select/poll 模型进化到了高效的 epoll。很多读者对 epoll 的惊人性能表示极大的兴趣&#xff0c;对它的工作原理也充满了好奇。今天&#xff0c;就让我们一起揭开 epoll 神秘的面纱&#x…...

Windows开始ssh服务+密钥登录+默认启用powershell

文章内所有的命令都在power shell内执行&#xff0c;使用右键单击Windows徽标&#xff0c;选择终端管理员即可打开 Windows下OpenSSH的安装 打开Windows power shell&#xff0c;检查SSH服务的安装状态。会返回SSH客户端和服务器的安装状态&#xff0c;一下是两个都安装成功的…...

实体商铺私域流量打造策略:从引流到转化的全链路解析

在数字化时代&#xff0c;实体商铺面临着前所未有的挑战与机遇。随着线上购物的兴起&#xff0c;传统商铺如何吸引并留住顾客&#xff0c;成为了每个实体店家必须面对的问题。私域流量的打造&#xff0c;正是解决这一问题的关键所在。本文将从引流、留存、转化三个方面&#xf…...

实战 | 通过微调SegFormer改进车道检测效果(数据集 + 源码)

背景介绍 SegFormer&#xff1a;实例分割在自动驾驶汽车技术的快速发展中发挥了关键作用。对于任何在道路上行驶的车辆来说&#xff0c;车道检测都是必不可少的。车道是道路上的标记&#xff0c;有助于区分道路上可行驶区域和不可行驶区域。车道检测算法有很多种&#xff0c;每…...

翻译《The Old New Thing》- Why do messages posted by PostThreadMessage disappear?

Why do messages posted by PostThreadMessage disappear? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20090930-00/?p16553 Raymond Chen 2008年09月30日 为什么 PostThreadMessage 发布的信息会消失&#xff1f; 在显示用户界面的线…...

【深度学习】—— 神经网络介绍

神经网络介绍 本系列主要是吴恩达深度学习系列视频的笔记&#xff0c;传送门&#xff1a;https://www.coursera.org/deeplearning-ai 目录 神经网络介绍神经网络的应用深度学习兴起的原因 神经网络&#xff0c;全称人工神经网络&#xff08;Artificial Neural Network&#xf…...

python-数字黑洞

[题目描述] 给定一个三位数&#xff0c;要求各位不能相同。例如&#xff0c;352是符合要求的&#xff0c;112是不符合要求的。将这个三位数的三个数字重新排列&#xff0c;得到的最大的数&#xff0c;减去得到的最小的数&#xff0c;形成一个新的三位数。对这个新的三位数可以重…...

SpringCloud 负载均衡 spring-cloud-starter-loadbalancer

简述 spring-cloud-starter-loadbalancer 是 Spring Cloud 中的一个组件&#xff0c;它提供了客户端负载均衡的功能。在 Spring Cloud 的早期版本中&#xff0c;Netflix Ribbon 被广泛用作客户端负载均衡器&#xff0c;但随着时间推移和 Netflix Ribbon 进入维护模式&#xff…...

牛客周赛-46

牛客周赛-46 a乐奈吃冰b素世喝茶c爱音开灯d小灯做题 a乐奈吃冰 ac code #include<iostream> using namespace std; int main(){long long a,b;cin>>a>>b;int tmpmin(b,a/2);long long resatmp;cout<<res;return 0; }b素世喝茶 #include<iostream…...

多模态vlm综述:An Introduction to Vision-Language Modeling 论文解读

目录 1、基于对比学习的VLMs 1.1 CLIP 2、基于mask的VLMs 2.1 FLAVA 2.2 MaskVLM 2.3 关于VLM目标的信息理论视角 3、基于生成的VLM 3.1 学习文本生成器的例子: 3.2 多模态生成模型的示例: 3.3 使用生成的文本到图像模型进行下游视觉语言任务 4、 基于预训练主干网…...

28.找零

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/744 题目描述 有一台自动售票机,每张票卖 …...

wordpress ide/重庆seo什么意思

耦合度一、什么是耦合度 耦合度就是某模块&#xff08;类&#xff09;与其它模块&#xff08;类&#xff09;之间的关联、感知和依赖的程度&#xff0c;是衡量代码独立性的一个指标&#xff0c;也是软件工程设计及编码质量评价的一个标准。耦合的强度依赖于以下几个因素…...

wordpress上传主题限制/百度上打广告怎么收费

对于C# 进行oracle 数据库的开发来说使用oracle 提供的odp.net 方式是比较方便的&#xff0c;同时在性能以及兼容性也是比较好的但是&#xff0c;对于不打算使用的&#xff0c;那么该如何使用oledb 进行连接连接的方式大家可定都比较了解就是ADO.net 但是最重要的是连接字符串是…...

做整合营销的网站/温州最好的seo

8.3 Spring Boot集成Scala混合Java开发 本章我们使用Spring Boot集成Scala混合Java开发一个Web性能测试平台。 使用到的相关技术&#xff1a; 后端&#xff1a; phantomjsscalajavaspringbootvelocityjpamavenmysql前端&#xff1a; jquerybootstrapadminLTEhtml/cssScala是一门…...

全屏网站源码/seo机构

Core Java第三章知识点总结 程序的流程控制 内容预览 顺序流程 分支流程 循环流程 顺序流程 以前的程序都是顺序流程&#xff0c;这里略过。 分支流程 1.if语句 a)格式&#xff1a; if(布尔表达式){ 语句内容 语句内容 } b)示例代码 int a 10; int b SystemIn.nextInt()…...

广州知名网站设计/百度热搜榜

谢谢作者: ITPUB warehousehttp://www.itpub.net/viewthread.php?tid906008&extra&page11、os认证oracle安装之后默认情况下是启用了os认证的&#xff0c;这里提到的os认证是指服务器端os认证。os认证的意思把登录数据库的用户和口令校验放在了操作系统一级。如果以…...

做网站运营需要具备哪些能力/热搜榜排名今日事件

前面章节,我们学习了怎么查看force信号,以及怎么在基于UVM平台下对信号进行force操作。今天,我们细致的研究下,force 信号对 RTL 代码中reg类型信号的影响。 先看例子:下面的例子中,clk,rst ,counter 三个信号,均声明为 reg 类型变量。我们着重关注一下 counter[7:0] 信…...