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

news2024/11/15 5:53:46

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

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

func QuickSort(arr []int) {
	if len(arr) <= 1 {
		return
	}

	base, l, r := arr[0], 0, len(arr)-1
	for 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_POINTERS
    MOVD 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    // arrayPtr
    MOVD slice+8(FP), R1    // arrayLength
    MOVD $0, R2             // l_index
    MOVD R1, R3             // r_index = arrayLength
    SUB  $1, R3             // r_index -= 1
    MOVD $0, R4             // pointer1
    MOVD $0, R5             // pointer2
    MOVD $8, R6             // dataSize
    MOVD $1,   R7           // index
    MOVD (R0), R8           // base   TODO random index
    MOVD $0,   R9

    CMP $1, R1; BLE LABEL_END       // if arrayLength <= 1 return
LABEL_FOR_START:
    CMP R3, R7; BGT LABEL_FOR_END   // if index > r_index return
    MOVD R7, R4      // offset = index
    MUL  R6, R4      // offset *= dataSize
    ADD R0,  R4      // arr[i] = R4
    MOVD (R4), R5    // arr[i]

    CMP R8, R5; BLE LABEL_SWAP // if arr[i] <= base

    MOVD R3, R5      // offset = r_index
    MUL  R6, R5      // offset *= dataSize
    ADD  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]  = tmp

    SUB  $1, R3       // r_index -= 1
    JMP LABEL_FOR_START
LABEL_SWAP:
    MOVD R7, R4
    MUL  R6, R4
    ADD  R0, R4
    MOVD R2, R5
    MUL  R6, R5
    ADD  R0, R5

    MOVD (R4), R9  // tmp = arr[i]
    MOVD (R5), R10 // tmp1 = arr[l]
    MOVD R10, (R4) // arr[i] = tmp1
    MOVD R9, (R5)  // arr[l] = tmp

    ADD $1, R2     // l_index += 1
    ADD $1, R7     // index += 1
    JMP LABEL_FOR_START
LABEL_FOR_END:
    MOVD R0, R4
    MOVD R2, R5
    MOVD R4, tmp-104(SP)
    MOVD R5, tmp-96(SP)
    CALL ·QuickSortByASM(SB)

    MOVD R2, R4
    ADD  $1, R4
    MUL  R6, R4
    ADD  R0, R4  // right address

    MOVD R1, R5  // tmp = arrayLength
    SUB  R2, R5  // tmp -= l_index
    SUB $1,  R5

    MOVD 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),  R1
    MOVD  tmp-8*5(SP),  R2; MOVD  tmp-8*6(SP),  R3
    MOVD  tmp-8*7(SP),  R4; MOVD  tmp-8*8(SP),  R5
    MOVD  tmp-8*9(SP),  R6; MOVD  tmp-8*10(SP), R7
    MOVD  tmp-8*11(SP),  R8;MOVD  tmp-8*12(SP), R9
    MOVD  tmp-8*13(SP), R10
    RET

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

对数器

package main

import (
	"fmt"
	"math/rand"
	"sort"
)

func QuickSortByASM(slice []int) // 汇编函数声明

func main() {
	N := 50
	for 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] = v
			slice2[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.coloradmin.cn/o/1308781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UI设计中的2.5D插画是什么?

2.5d插画&#xff0c;你可能第一时间会想2D应该是平面的&#xff0c;3D是立体的&#xff0c;介于2D和3D之间&#xff0c;那么它就是在平面上面看立体的2.5D透视原理图像&#xff0c;就是物体的正面、光面和暗面三面组成&#xff0c;也算是伪3D。 首先&#xff0c;设计师需要设…

一进一出两线制(三线制)模拟量高速信号(50KHz)隔离变送器

一进一出两线制(三线制)模拟量高速信号(50KHz)隔离变送器 型号&#xff1a;JSD TA-2311F系列 产品特点&#xff1a; ◆小体积,低成本,标准 DIN35mm 导轨安装方式 ◆三端隔离(输入、输出、工作电源间相互隔离) ◆高速信号采集,隔离等(-3dB,Min≤ 3.5 uS) ◆高精度等级(0.1% F.S&…

Leetcode 2132. 用邮票贴满网格图(Java + 两次一维前缀和 + 二维差分)

Leetcode 2132. 用邮票贴满网格图&#xff08;Java 两次一维前缀和 二维差分&#xff09; 题目 给你一个 m x n 的二进制矩阵 grid &#xff0c;每个格子要么为 0 &#xff08;空&#xff09;要么为 1 &#xff08;被占据&#xff09;。给你邮票的尺寸为 stampHeight x sta…

2-2基础算法-递归/进制转换

文章目录 一.递归二.进制转换 一.递归 1.数的计算 评测系统 #include <iostream> int countCombinations(int n) { //计算当然组合种数if (n 1) {return 1;}int count 1;//数字本身就是一个有效组合for (int i 1; i < n / 2; i) {count countCombinations(i);/…

50mA、24V、超低 IQ、低压降稳压器

一、Description The TPS715 low-dropout (LDO) voltage regulators offer the benefits of high input voltage, low-dropout voltage, low-power operation, and miniaturized packaging. The devices, which operate over an input range of 2.5 V to 24 V, are stable wit…

【云原生kubernets】Ingress 功能与应用

一、Ingress 介绍 1.1.Ingress产生原因&#xff1a; 当我们使用Service的时候&#xff0c;Service对集群之外暴露服务的主要方式有两种&#xff1a;NotePort和LoadBalancer&#xff0c;但是这两种方式&#xff0c;都有一定的缺点&#xff1a; &#xff08;1&#xff09;Node…

[Excel] vlookup函数

VLOOKUP用法 VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])其中&#xff1a; lookup_value是你要查找的值table_array是你要在其中进行查找的表格区域col_index_num是你要返回的在table_array中列索引号range_lookup是一个可选参数&#xff0c;用于指定…

螺旋矩阵算法(leetcode第59题)

题目描述&#xff1a; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。示例 1&#xff1a;输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]] 示例 2&#xff1a;输入&#…

大数据存储技术(2)—— HDFS分布式文件系统

目录 一、HDFS简介 &#xff08;一&#xff09;HDFS产生背景及定义 &#xff08;二&#xff09;HDFS的优点 &#xff08;三&#xff09;HDFS的局限性 二、HDFS体系结构 &#xff08;一&#xff09;HDFS组成架构 &#xff08;二&#xff09;机架感知策略 &#xff08;三…

bugku--文件包含

点击 访问一下index.php 页面报错 既然是文件包含就可以想到php伪协议 这里我们需要访问本地文件系统 构造我们的payload ?filephp://filter/readconvert.base64-encode/resourceindex.php base64解码 得到我们的flag 提交就好啦 ?filephp://filter/readconvert.base64-e…

用于 ChatGPT 的 FPGA 加速大型语言模型

简介&#xff1a;大型语言模型 近年来&#xff0c;大型语言模型 &#xff08;LLM&#xff09; 彻底改变了自然语言处理领域&#xff0c;使机器能够生成类似人类的文本并进行有意义的对话。这些模型&#xff0c;例如 OpenAI 的 GPT&#xff0c;具有惊人的理解和生成语言的能力。…

机器人行业数据闭环实践:从对象存储到 JuiceFS

JuiceFS 社区聚集了来自各行各业的前沿科技用户。本次分享的案例来源于刻行&#xff0c;一家商用服务机器人领域科技企业。 商用服务机器人指的是我们日常生活中常见的清洁机器人、送餐机器人、仓库机器人等。刻行采用 JuiceFS 来弥补对象存储性能不足等问题。 值得一提的是&am…

数据结构与算法:选择排序

原理 从当前位置到最后&#xff0c;找出最小(或者最大)值&#xff0c;放在当前位置&#xff0c;位置后移。然后重复此过程。 每次都要在剩余未排序的集合中&#xff0c;找到那个最小(或者最大)的值&#xff0c;放到当前位置。所以叫选择排序。 最小或者最大&#xff0c;影响…

Wordle 游戏实现 - 使用 C++ Qt

标题&#xff1a;Wordle 游戏实现 - 使用 C Qt 摘要&#xff1a; Wordle 是一款文字猜词游戏&#xff0c;玩家需要根据给定的单词猜出正确的答案&#xff0c;并在限定的次数内完成。本文介绍了使用 C 和 Qt 框架实现 Wordle 游戏的基本思路和部分代码示例。 引言&#xff1a;…

《快乐阅读》期刊论文发表投稿

《快乐阅读》期刊是经中华人民共和国新闻出版总署审核通过的&#xff0c;由河南文艺出版社有限公司主办、中原大地传媒股份有限公司主管的&#xff0c;面向国内外公开发行的省级优秀学术刊物。 收稿栏目&#xff1a;清唱、微课堂、教学实践、专栏、师与道、教与学、经验交流、…

腾讯云 - 日志服务(CLS)Bug 体验官

问题描述 最近在学习日志服务&#xff0c;发现了腾讯云上面一款CLS产品&#xff0c;致力于解决日志采集分析&#xff0c;刚开始用的时候感觉还不错&#xff0c;但是发现当创建第二个日志主题的时候发现不对劲了&#xff0c;前一个竟然失效了&#xff0c;排查了老半天也没发现啥…

jupyter notebook介绍、安装和使用

简介 Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算&#xff1a;开发、文档编写、运行代码和展示结果。——Jupyter Notebook官方介绍 简而言之&#xff0c;Jupyter Notebook是以网页的形式打开&#xff0c;可以在网页页面中直接编写代码和运…

关于职场伪勤奋

前段时间看了一些关于勤奋学习、职场成长类的书籍&#xff0c;就在思考勤奋学习和职场的关系时&#xff0c;结合个人的理解&#xff0c;我定义了一种勤奋叫职场“伪勤奋”。那关于职场“伪勤奋”的定义和理解&#xff0c;与大家分享&#xff1a; 1、选择性任务完成 伪勤奋特征…

两款顶尖大语言模型Claude2.1和Llama2在Amazon Bedrock正式可用

在亚马逊云科技2023 re:Invent美国拉斯维加斯现场&#xff0c;亚马逊云科技数据和人工智能副总裁Swami Sivasubramanian宣布了众多在生成式AI领域的发布和创新&#xff0c;其中就包括Anthropic Claude 2.1和Meta Llama 2 70B两款大语言模型已在Amazon Bedrock正式可用。 亚马逊…

用23种设计模式打造一个cocos creator的游戏框架----(十五)策略模式

1、模式标准 模式名称&#xff1a;策略模式 模式分类&#xff1a;行为型 模式意图&#xff1a;定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可以相互替换。此模式使得算法可以独立于使用它们的客户而变化 结构图&#xff1a; 适用于&#xff1…