几种排序算法的对比

几种常见排序算法的实现及运行时间对比 // 冒泡排序 function popSort(arr) { if (arr.length < 2) return arr; let n = arr.length; while (n > 1) { let exchanged = false; for (let i = 0; i < n - 1; i++) { if (arr[i] > arr[i + 1]) { exc. 阅读详情

!
最近干了一些有意思的事情:拿出来写一写

关于各种sort!

比如,c++自带的快排,归并排序,还有stdlib库里面的qsort

还有我自己实现的二进制基排,65536进制基数排序,普通归并排序,FFT式归并排序

以及基于队列实现的queue-mergesort(其实本质还是mergesort啦)

目前测试结果来看,表现最好的,应该是普通归并排序(65536基排不算),排序 10710^7107个数字只用了1.1s,让后就是queue-mergesort

反正各种快排没有那么优秀啦,加上O3还是没有mergesort快

解释一下这个queue-mergesort
首先,每个数作为一个独立的“块”放入队列中,每次取出开头的两个“块”进行合并让后丢到队尾,容易看出这个算法复杂度为O(nlog⁡n)O(n\log n)O(nlogn)

算法本身需要用到循环队列进行辅助操作,让后为了减小常数,取模使用位运算代替,这就意味着要牺牲一部分空间作为代价,同时,为了记录各个块的信息,还要额外开一个数组记录

不过这个算法的思想还是很不错的
放一个code上来

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#define SIZ 10000000
using namespace std;
unsigned s[20000001],b[33554431],*w=s;
inline int mkd(){
	for(int T=SIZ;T;--T)
		s[T]=(s[T+1]*3859+65492)^235993592ll;
}
int cmp(const void* a,const void* b){
	return *(unsigned*)a<*(unsigned*)b?-1:1;
}
inline void radix(int V,int n=10000000){
	int c[65536]={0};
	for(int i=1;i<=n;++i) ++c[s[i]>>V&65535];
	for(int i=1;i<65536;++i) c[i]+=c[i-1];
	for(int i=n;i;--i) b[c[s[i]>>V&65535]--]=s[i];
	memcpy(s+1,b+1,n<<2);
}
inline void merge(int l,int r){
	if(l<r){
		register int m=l+r>>1,i=l,j=m+1,t=l;
		merge(l,m); merge(m+1,r);
		for(;i<=m && j<=r;)
			b[t++]=(s[i]<=s[j]?s[i++]:s[j++]);
		for(;i<=m;b[t++]=s[i++]);
		for(;j<=r;b[t++]=s[j++]);
		memcpy(s+l,b+l,r-l+1<<2);
	}
}
inline void split(int l,int r,unsigned V){
	if(l<r){
		int i=l,j=r;
		for(;i<j;){
			for(;i<j&&s[j]&V;--j);
			for(;i<j&&~s[i]&V;++i);
			if(i<j) s[i]^=s[j]^=s[i]^=s[j];
			else{ s[j]&V?--i:++j; break; }
		}
		V>1?split(l,i,V>>1),split(j,r,V>>1):(void)0;
	}
}
inline void FFT(int n){
	int m; for(m=1;m<n;m<<=1);
	for(int i=m;i>n;--i) s[i]=-1;
	register unsigned *S=s,*B=b;
	for(register int L=2,M=1,l,i,j;M<m;L<<=1,M<<=1){
		for(l=0;l<m;l+=L,S+=L){
			for(i=1,j=M+1;i<=M&&j<=L;)
				*++B=(S[i]<=S[j]?S[i++]:S[j++]);
			for(;i<=M;*++B=S[i++]);
			for(;j<=L;*++B=S[j++]);
		}
		S-=m; B-=m;	swap(S,B);
	}
} 
inline void chk(){
	for(int i=1;i<SIZ;++i)if(s[i]>s[i+1]) 
	puts("#");
	puts("Pass");
}
inline void qusort(int n){
	const int m=33554431;
	register int H=0,T=-1,t=n,l,r,M,i,j;
	memcpy(b+1,s+1,n<<2);
	for(int i=1;i<=n;++i) w[++T]=i;
	for(;H<T;){
		l=w[H++]; M=w[H++]; w[++T]=t+1&m; r=w[H]; 
		for(i=l,j=M;(i&m^M)&&(j&m^r);)
			b[++t&m]=(b[i&m]<=b[j&m]?b[i++&m]:b[j++&m]);
		for(;i&m^M;b[++t&m]=b[i++&m]);
		for(;j&m^r;b[++t&m]=b[j++&m]);
	}
	t=w[T];
	for(int i=0;i<n;++i) s[i+1]=b[i+t&m];
}
int main(){
	mkd();
	qsort(s+1,10000000,4,cmp);
	FFT(10000000);
	sort(s+1,s+10000001);
	stable_sort(s,s+1+10000001);
	radix(0); radix(16); 
	merge(1,10000000);
	split(1,10000000,1u<<31);
	qusort(SIZ);
	chk();
}
基于stm32的数控恒压恒流电源设计方案 基于stm32的数控恒压恒流电源设计方案 基于stm32的数控恒压恒流电源设计方案 不包实物,可自己动手制作,可代做 本设计采用220V市电输入工频变压器,将220V交流电压降为24V交流电压,经过全桥整流加电容滤波,输出约32V直流电压.可调输出电压方案采用线性稳压调整器方案,即运放处于比较调整状态,运放输出驱动P型MOS管,电压输出端由电阻分压反馈至运放同相输入端,运放反相输入端由STM32单片机控制TLC5615数模转换器输入模拟电压,根据运放构成比较器原理,运放的同相端和反相端始终趋向于电压相等的特 阅读详情

相关推荐

python毕设 基于Web的中药材信息查询系统程序+论文

***(程序+源码+数据库+调试部署+开发环境)论文文档1,文末可获取,系统界面在最后面。****

m0_74825541的博客 1257

C++排序算法(归并排序)

分治: 归并排序:把两个有序素组合并成1个。下面是示意图: 一路按组拆分,直到拆分到最后 接下里进行 二分查找:

qq_27158571的博客 332

基于Stigmergy的团队LLM wiki协作机制与FastAPI工程实践

大语言模型驱动的知识管理正在改变个人笔记与团队文档的维护方式,但当多人共同维护一个维基时,如何避免版本覆盖、上下文丢失和幻觉污染成为核心挑战。Stigmergy这一源自生物学的协作机制提供了新思路:通过共享环境中的痕迹(如评论、标记、修订历史)实现异步协作,无需实时沟通或中心协调者。本文将原理落地为可工程化的系统,设计Page、Revision、Trace三大实体,并结合向量索引与LLM审查流程,最终用FastAPI与SQLite搭建一个最小可运行原型。从白蚁筑巢到团队知识库,Stigmergy让每个参与者

weixin_34174322的博客 364

字符串哈希函数

1.简介本文将介绍什么是字符串哈希函数,字符串哈希函数常见用法,以及字符串哈希函数的实现原理和常用算法。2.概念哈希之所以广泛存在,是因为它能在绝大多数情况下可以在O(1)的时间复杂度中完成元素的查找。它的核心是数组,如果输入是一个自然数,那么当然可以在常数时间内搜索到自然数所对应的数组元素了。但在工程实践中,要查找的关键字往往都不是自然数,即使是自然数也有可能是很大的值。因此,只要我们提前把关键...

MyLinChi的博客 1万+

RK3588开发板实战:从零开始移植Ubuntu 24.04(讯为SDK版)

本文详细介绍了如何在RK3588开发板上从零开始移植Ubuntu 24.04系统(讯为SDK版),涵盖开发环境准备、SDK解析、根文件系统定制、驱动适配、系统集成与烧录等全流程。通过实战案例,帮助开发者快速掌握RK3588开发板的系统移植技巧,适用于嵌入式开发与定制化Linux系统构建。

sand8的博客 436

QEMU+KVM实战:5分钟搞定Ubuntu 24.04虚拟机搭建(附性能优化技巧)

本文详细介绍了在Linux宿主机上使用QEMU和KVM快速搭建Ubuntu 24.04虚拟机的完整实战流程。内容涵盖从环境准备、核心组件解析到具体的安装命令,并重点分享了针对CPU、内存、存储I/O及网络性能的深度优化技巧,旨在帮助用户构建一个响应迅速、资源隔离良好的高性能虚拟化开发与测试环境。

j2k3l4的博客 753

ash的采样机制

ash的采样机制

msdnchina的专栏@JiNan,ShanDong 625

激光雷达点云异常现象详解:鬼影、高反膨胀与拖点

现象核心外观主要成因核心硬件对策核心算法对策鬼影位置错误,出现"复制"的物体镜面反射/光学元件间杂散光物理光阑、抗反射涂层多帧时序一致性检验、反射率逻辑判断膨胀尺寸变大,轮廓呈毛刺状信号饱和、像素/通道串扰可变增益控制、随机编码序列强度阈值滤波、几何轮廓拟合(剪裁)拖点边缘粘连,出现"阶梯"或"连线"光斑跨立边缘、双回波融合小光斑光学设计、多回波支持邻域深度突变检测、波形脉宽分析这些异常现象是当前激光雷达感知中的核心难点,通常需要硬件物理特性优化与上层感知算法。

Fun_LiDAR的博客 299

常见的hash算法及其原理

 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。   哈希表是根据设定...

Beyond_2016的博客 28万+

采样率转化代码C++(有理倍数,升采样、降采样均可)

【代码】采样率转化(有理倍数,升采样、降采样均可)

goudahai的专栏 545

1.2 机器人控制系统软硬件平台

工业机器人的软硬件平台架构是影响工业机器人性能和效率的重要因素。良好的软硬件平台架构可以帮助工业机器人更加稳定和高效地完成工作,提高生产效率。正确的软硬件配置还可以提高工业机器人的灵活性和可靠性,使其能够更好地适应不断变化的生产环境。 同时,工业机器人的软硬件平台架构还可以影响工业机器人的安全性和维护成本。如果软硬件平台架构不合适,工业机器人可能出现故障或安全隐患,需要大量的维护和维修费用。因此,选择适当的软硬件平台架构对于确保工业机器人的高效运行和长期使用是非常重要的。

Galaxy_Robot的博客 2万+

Oracle ASH分析详解

一. ASH(Active Session History) ASH以V$SESSION为基础,每秒采样一次,记录活动会话等待的事件。不活动的会话不会采样, 采样工作由新引入的后台进程MMNL完成。 v$active_session_history视图提供了在实例级别抽取会话活动信息。活动会话每分钟会被抽样一次且被存储在sga中的循环缓冲区中。任何被连接到数据库且正等待一个不属于空闲等待时间的

gumengkai的博客 1万+

手把手教你学simulink(40.1)--水力发电场景示例:基于 Simulink 的抽水蓄能电站水力发电

项目背景抽水蓄能电站是一种重要的储能技术,广泛应用于电力系统的调峰填谷、频率调节和备用电源。它通过在电力负荷低谷时将水从下水库抽到上水库储存,在电力负荷高峰时释放水进行发电,从而实现电能的高效利用。与传统的水电站不同,抽水蓄能电站可以在短时间内快速响应电网的需求,具有良好的灵活性和可靠性。本项目旨在使用 MATLAB/Simulink 模拟一个完整的抽水蓄能电站的水力发电过程,包括水泵-涡轮机系统、发电机、水道系统、控制系统等,并实现对电站的精确控制,确保其在不同工况下都能稳定运行。

MHD0815的博客 885

对比 几种 排序算法 的 比较次数

今天在实际项目中遇到了一个排序问题,对Object排序,其中比较操作特别耗时,而交换操作的时间可以忽略不计,这样就不能用之前一直了解的最佳实践的快速排序了,得重新评价各种排序算法的比较次数,因此做了以下实验:对比了在处理相同长度的随机数组排序时,各种排序的比较次数: 实验结果输出如下:(注:里面InsertSort使用的是二分插入排序) 10 numbers: Bubbl...

agkn25038的博客 2948

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jre9下载 jdk9

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

几种排序算法的属性对比

几种排序算法的属性对比 一、冒泡排序 特点:效率低,实现简单  原理:将待排序列中最大的数往后冒泡,成为新的序列,重复以上操作直到所有元素排列完成 public class PaiXu {     public static void main(String []args) {         maoPao(a);     }     /**     *冒泡排序     */     ...

Jaylon Wang的专栏 3639

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

插入,冒泡等几种排序算法的对比

每种语言几乎都内置了排序的函数或者方法,很多时候并不需要自己手动书写一些排序算法,因此对于排序算法如何实现都是一知半解,知其然不知其所以然,很多时候看似相同,例如排序算法基本就是比较,交换,但是其中的如何比较,何时交换原理是不同的。 以下代码实现均为PHP 以下动图均来自这位博主的文章 插入排序 实现思路:从第二个元素开始往前比较,如果符合条件,则交换位置 代码实现 function insert_sort($arr) { $num = count($arr); for ($i = 1; $i &lt

a7442358的专栏 234

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

几种常见的排序算法对比

几种常见的排序算法对比: 排序法 平均时间 最差情形 稳定度 额外空间 备注 冒泡 O(n2) O(n2) 稳定 O(1) n小时较好 交换 O(n2) O(n2)

HANJUN的专栏 509

几种排序算法及其效率对比

冒泡排序 public class BubbleSort { public static void main(String[] args) { int[] arr = new int[10000]; for(int i = 0;i < arr.length;i++){ int random = (int) (Math.random() * 10000); arr[i] = random; } //

qq_44768363的博客 384

[笔试]几种常见的排序算法对比

几种常见的排序算法对比

angelsmiles的专栏 359

Java:几种排序算法对比

直接插入排序 插入排序就是:取出一个数,插入到有序数组中,首先,取出第一个元素放入有序数组中,然后取出第二个,两个数进行比较,如果它小,则有序数的最后一个向后移动一格,然后与有序数组倒数第二个比较,如果小,则继续向后移动。如果碰到比它小的,则插入在其后面。 算法思想为:外层循环是遍历数组的所有值 内层循环是,找到小于该值的下标,然后大于该下标的值向后移动。 public static void i...

qq_43220266的博客 534

几种排序算法速度对比,顺便对比一下 ES6 内置的 sort 方法

JS实现几种排序算法速度对比,快速排序胜出。得益于 v8 引擎强大的性能优化,用 sort 方法更快。

1709

几种排序算法时间复杂度对比

排序法 平均时间 最差情形 稳定度 额外空间 备注 冒泡 O(n2) O(n2) 稳定 O(1) n小时较好 交换 O(n2) O(n2) 不稳定 O(1) n小时较好 选择 O(n2) O(n2) 不稳定 O(1) n小时较好 插入 O(n2) O(n2) 稳定 O(1) 大部分已排序时较好 基数 O(logRB) O(logRB) 稳定 O(n) B是真数(0-9), R是基数(个十百) Sh

冰镇-西瓜的博客 639

几种常用排序算法的思路和复杂度对比

1、插入排序——直接插入排序、希尔排序 (1)直接插入排序思路:从第1号元素开始,每个元素依次与前面的元素做比较,小的排前面,这样当比较到最后一 个元素完即完成排序。 (2)希尔排序思路:         首先以d1(0 d1一般在n/3~n/2之间。   希尔排序是不稳定的。 void ShellSearch(ElemType A[], int n){ ElemTyp

欢迎交流 1757

几种常见排序算法的分析

几种常见排序算法的分析摘要 插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序和基数排序是计算机科学中常用的几种排序算法。本文简要的介绍了这几种算法的思路,并给出了公认的这些算法的时间复杂度表。在本文的最后,通过实验比较了各种算法的执行效率,并做了一些分析。 前言 冒泡排序是最简单的排序算法,在所有算法中平均效率是最低的,但便于理解,适用于记录个数n较小的排序中;选择排序适用于记录个

ChaoQun 2132
上一篇: 优快云-markdown编辑器使用帮助
下一篇: 音乐测试
扩展的灰
博客等级 码龄12年 60粉丝 342原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值