用Go汇编实现一个快速排序算法

本代码全网首发,使用Go plan9 windows arm64汇编,实现基础版快速排序算法。

未引入随机因子的快速排序的普通Go代码长这样。

func QuickSort(arr []int) {if len(arr) <= 1 {return}base, l, r := arr[0], 0, len(arr)-1for i := 1; i <= r; {if arr[i] > base {arr[i], arr[r] = arr[r], arr[i]r--continue}arr[i], arr[l] = arr[l], arr[i]l, i = l+1, i+1}QuickSort(arr[:l])QuickSort(arr[l+1:])
}

在这里插入图片描述

如下,使用windows arm64 Go plan9汇编实现的快速排序。

file: quickSort.s

#include "textflag.h"
// func QuickSortByASM(slice []int)
TEXT ·QuickSortByASM(SB), $104-24// NO_LOCAL_POINTERSMOVD R0 , tmp-8*3(SP);  MOVD R1 , tmp-8*4(SP)MOVD R2 , tmp-8*5(SP);  MOVD R3 , tmp-8*6(SP)MOVD R4 , tmp-8*7(SP);  MOVD R5 , tmp-8*8(SP)MOVD R6 , tmp-8*9(SP);  MOVD R7 , tmp-8*10(SP)MOVD R8 , tmp-8*11(SP); MOVD R9 , tmp-8*12(SP)MOVD R10, tmp-8*13(SP)MOVD slice+0(FP), R0    // arrayPtrMOVD slice+8(FP), R1    // arrayLengthMOVD $0, R2             // l_indexMOVD R1, R3             // r_index = arrayLengthSUB  $1, R3             // r_index -= 1MOVD $0, R4             // pointer1MOVD $0, R5             // pointer2MOVD $8, R6             // dataSizeMOVD $1,   R7           // indexMOVD (R0), R8           // base   TODO random indexMOVD $0,   R9CMP $1, R1; BLE LABEL_END       // if arrayLength <= 1 return
LABEL_FOR_START:CMP R3, R7; BGT LABEL_FOR_END   // if index > r_index returnMOVD R7, R4      // offset = indexMUL  R6, R4      // offset *= dataSizeADD R0,  R4      // arr[i] = R4MOVD (R4), R5    // arr[i]CMP R8, R5; BLE LABEL_SWAP // if arr[i] <= baseMOVD R3, R5      // offset = r_indexMUL  R6, R5      // offset *= dataSizeADD  R0, R5      // arr[r]MOVD (R5), R9    // tmp     = arr[r]MOVD (R4), R10   // tmp1    = arr[i]MOVD R10, (R5)   // arr[r]  = arr[i]MOVD R9, (R4)    // arr[i]  = tmpSUB  $1, R3       // r_index -= 1JMP LABEL_FOR_START
LABEL_SWAP:MOVD R7, R4MUL  R6, R4ADD  R0, R4MOVD R2, R5MUL  R6, R5ADD  R0, R5MOVD (R4), R9  // tmp = arr[i]MOVD (R5), R10 // tmp1 = arr[l]MOVD R10, (R4) // arr[i] = tmp1MOVD R9, (R5)  // arr[l] = tmpADD $1, R2     // l_index += 1ADD $1, R7     // index += 1JMP LABEL_FOR_START
LABEL_FOR_END:MOVD R0, R4MOVD R2, R5MOVD R4, tmp-104(SP)MOVD R5, tmp-96(SP)CALL ·QuickSortByASM(SB)MOVD R2, R4ADD  $1, R4MUL  R6, R4ADD  R0, R4  // right addressMOVD R1, R5  // tmp = arrayLengthSUB  R2, R5  // tmp -= l_indexSUB $1,  R5MOVD R4, tmp-104(SP)MOVD R5, tmp-96(SP)CALL ·QuickSortByASM(SB)
LABEL_END:MOVD  tmp-8*3(SP),  R0; MOVD  tmp-8*4(SP),  R1MOVD  tmp-8*5(SP),  R2; MOVD  tmp-8*6(SP),  R3MOVD  tmp-8*7(SP),  R4; MOVD  tmp-8*8(SP),  R5MOVD  tmp-8*9(SP),  R6; MOVD  tmp-8*10(SP), R7MOVD  tmp-8*11(SP),  R8;MOVD  tmp-8*12(SP), R9MOVD  tmp-8*13(SP), R10RET

该汇编版本快排基于普通版快排手写而成, 未加入stackmap信息,大数据量样本可能会出现panic,仅供参考。

对数器

package mainimport ("fmt""math/rand""sort"
)func QuickSortByASM(slice []int) // 汇编函数声明func main() {N := 50for index := 0; index < 1000; index++ {slice := make([]int, N)for i := 0; i < N; i++ {slice[i] = rand.Int()}slice1 := make([]int, N)slice2 := make([]int, N)for i, v := range slice {slice1[i] = vslice2[i] = v}sort.Ints(slice1)QuickSortByASM(slice2)for i := 0; i < N; i++ {if slice1[i] != slice2[i] {fmt.Println(slice)fmt.Println(slice1)fmt.Println(slice2)panic(i)}}}fmt.Println("pass")
}

pass

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/219386.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【jenkins操作步骤】

一、安装ant 1、下载安装文件 1.1 进入https://ant.apache.org/ 然后点击 https://ant.apache.org/bindownload.cgi 超连接下载即可 1.2下载到本地&#xff0c;最好放到D盘下&#xff0c;然后把apache-jmeter-4.0\extras目录下的ant-jmeter-1.1.1.jar 文件放置到ant下的lib目…

Unity Web 浏览器-3D WebView中有关于CanvasWebViewPrefab

一、CanvasWebViewPrefab默认设置 这个是在2_CanvasWebViewDemo示例场景文件中可以可以查看得到&#xff0c;可以看出CanvasWebViewPrefab的默认配置如下。 二、Web 浏览器网页和Unity内置UI的渲染顺序 1、如果你勾选了以下这个Native 2D Mode选项的话&#xff0c;那么Unit…

MacOS多屏状态栏位置不固定,程序坞不小心跑到副屏

目录 方式一&#xff1a;通过系统设置方式二&#xff1a;鼠标切换 MacOS多屏状态栏位置不固定&#xff0c;程序坞不小心跑到副屏 方式一&#xff1a;通过系统设置 先切换到左边 再切换到底部 就能回到主屏了 方式二&#xff1a;鼠标切换 我的两个屏幕放置位置如下 鼠标在…

【IC前端虚拟项目】MVU模块方案与背景熟悉

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 mvu这个模块是干嘛用的呢&#xff1f;从这个名字就可以看出来move_unit&#xff0c;应该是做数据搬运的。很多指令级中都会有数据搬运的指令&#xff0c;这类指令的作用一般是在片内片外缓存以及通用专用…

阿里云RDS MySQL 数据如何快速同步到 ClickHouse

云数据库 RDS MySQL 和 云数据库 ClickHouse 是阿里云推出的两个备受欢迎的数据库解决方案&#xff0c;它们为用户提供了可靠的数据存储方案、分析数仓方案&#xff0c;本文介绍如何快速将 RDS MySQL 的数据同步到云数据库 ClickHouse。 如何快速将RDSMySQL的数据同步到云数据库…

【Linux】cp问题,生产者消费者问题代码实现

文章目录 前言一、 BlockQueue.hpp&#xff08;阻塞队列&#xff09;二、main.cpp 前言 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯&#xff0c;而通过阻塞队列来进行通讯&#xff0c;所以生产者生产完数据之后不用…

Sketch for Mac:实现你的创意绘图梦想的矢量绘图软件

随着数字时代的到来&#xff0c;矢量绘图软件成为了广告设计、插画创作和UI设计等领域中必不可少的工具。在众多矢量绘图软件中&#xff0c;Sketch for Mac&#xff08;矢量绘图软件&#xff09;以其强大的功能和简洁的界面脱颖而出&#xff0c;成为了众多设计师的首选。 Sket…

RHEL7.5编译openssl1.1.1w源码包到rpm包

openssl1.1.1w下载地址 https://www.openssl.org/source/ 安装依赖包 yum -y install curl which make gcc perl perl-WWW-Curl rpm-build wget http://mirrors.aliyun.com/centos-vault/7.5.1804/os/x86_64/Packages/perl-WWW-Curl-4.15-13.el7.x86_64.rpm rpm -ivh pe…

hive常用SQL函数及案例

1 函数简介 Hive会将常用的逻辑封装成函数给用户进行使用&#xff0c;类似于Java中的函数。 好处&#xff1a;避免用户反复写逻辑&#xff0c;可以直接拿来使用。 重点&#xff1a;用户需要知道函数叫什么&#xff0c;能做什么。 Hive提供了大量的内置函数&#xff0c;按照其特…

【95 6K⭐】Scrcpy:一款免费、强大且实用的Android镜像投屏控制软件

【95.6K⭐】Scrcpy&#xff1a;一款免费、功能丰富且实用的Android镜像投屏控制软件 随着科技的不断发展&#xff0c;我们的生活中出现了越来越多的智能设备。尤其是智能手机&#xff0c;已经成为了我们日常生活中不可或缺的一部分。然而&#xff0c;有时候我们需要在电脑上操…

CesiumLab地理信息基础数据处理平台 各类数据类型介绍、发布数据介绍

目录 0 引言1 CesiumLab2 数据处理模块2.1 输出格式&#xff1a;切片文件格式2.2 输入格式2.2.1 传统GIS数据2.2.2 人工模型2.2.3 BIM模型2.2.4 倾斜实景数据2.2.5 点云数据 3 发布服务功能3.1 拓展&#xff1a;其他平台发布服务功能 &#x1f64b;‍♂️ 作者&#xff1a;海码…

件夹和文件比较软件VisualDiffer mac功能介绍

VisualDiffer mac是一款运行在MacOS上的文件夹和文件快速比较工具。VisualDiffer可以对不同文件夹中文件或文档做出比较或者比较两个文件的路径。还可以通过UNIS diff命令快速、标准和可靠的比较出各类不同的文件夹和文件结果&#xff0c;使用不同的颜色直观地显示。 VisualDif…

Element 介绍

Element 介绍 Vue 快速入门 Vue 常见组件 表格 分页组件 其他自己去看吧 链接: 其他组件

基于linux系统的Tomcat+Mysql+Jdk环境搭建(二)jdk1.8 linux 上传到MobaXterm 工具的已有session里

【JDK安装】 1.首先下载一个JDK版本 官网地址&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 下载1.8版本&#xff0c;用红框标注出来了&#xff1a; 也许有的同学看到没有1.8版本&#xff0c;你可以随便下载一个linux的…

保姆级:Windows Server 2012上安装.NET Framework 3.5

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Windows》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有…

MySQL笔记-第10章_创建和管理表

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第10章_创建和管理表1. 基础知识1.1 一条数据存储的过程1.2 标识符命名规则1.3 MySQL中的数据类型 2. 创建和管理数据库2.1 创建数据库2.2 使…

在Node.js中MongoDB排序的方法

本文主要介绍在Node.js中MongoDB排序的方法。 目录 Node.js中MongoDB排序使用原生的mongodb驱动程序进行排序使用Mongoose库中的排序 Node.js中MongoDB排序 在Node.js中使用MongoDB进行排序&#xff0c;可以使用原生的mongodb驱动程序或者Mongoose库。 使用原生的mongodb驱动…

spring6 基于xml自动装配

目录结构 代码 UserContronller.java package bean.auto.controller;import bean.auto.service.UserService; import bean.auto.service.UserServiceImpl;public class UserContronller {private UserService userService;public void setUserService(UserService userServ…

多条件三元表达式如何写?

在某些业务需求情况下&#xff0c;如何书写多条件三元表达式&#xff1f;&#xff08;例如&#xff0c;父组件传值给子组件&#xff0c;子组件根据不同的值去响应不同的颜色变化该如何实现&#xff1f;&#xff09; 父组件&#xff1a; 父组件传testData的值给子组件&#xff…

C++类与对象 (上)

目录 前言&#xff1a; 类和对象的理解 类的引入 类的定义与使用方式 访问限定符 类的两种定义方式 成员变量的命名规则 类的作用域 类的实例化 类对象模型 计算类对象的大小 类对象的存储方式 this指针 前言&#xff1a; C语言是面向过程的&#xff0c;关注的是过…