Go语言golang调用sort.Slice实现struct切片的快速排序

sort.Slice声明

func Slice(slice interface{}, less func(i, j int) bool) {
    rv := reflectValueOf(slice)
    swap := reflectSwapper(slice)
    length := rv.Len()
    quickSort_func(lessSwap{less, swap}, 0, length, maxDepth(length))
}

实际使用

和C++的sort模板类似,只需要实现less函数,Go特别的是传入的函数不是直接传入less,而是一个匿名函数,匿名函数的参数是两个下标,表示两个比较元素在切片中的下标

type Person struct {
    h int
    k int
}

func PersonLess(p Person, other Person) bool{
    if p.h > other.h {
        return true
    } else if p.h < other.h {
        return false
    } else {
        return p.k <= other.k
    }
}

func reconstructQueue(people [][]int) [][]int {
    personSlice := NewPersonSlice(people)
    sort.Slice(personSlice, func(i, j int) bool {
        return PersonLess(personSlice[i], personSlice[j])
    })
}

原文地址:https://www.cnblogs.com/roastpiglet/p/12123524.html

时间: 2024-11-07 04:52:00

Go语言golang调用sort.Slice实现struct切片的快速排序的相关文章

go语言-golang基础-数据类型数组,数组切片,映射

7.7 数组 数组是Go语言编程中最常用的数据结构之一.顾名思义,数组就是指一系列同一类型数据的集合.数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度. 以下为一些常规的数组声明方法: [32]byte // 长度为32的数组,每个元素为一个字节 [2*N] struct { x, y int32 } // 复杂类型数组 [1000]*float64 // 指针数组 [3][5]int // 二维数组 [2][2][2]float64 // 等同于[2

golang生成c-shared so供c语言或者golang调用到例子

1.golang生成c-shared类型到so 建立文件夹hello,创建main.go文件,内容如下 package main import "C" func main() {} //export Hello func Hello() string { return "Hello" } //export Test func Test() { println("export Test") } 生成so脚本文件,命令行: export GOARCH

Golang中的Slice与数组

1.Golang中的数组 数组是一种具有固定长度的基本数据结构,在golang中与C语言一样数组一旦创建了它的长度就不允许改变,数组的空余位置用0填补,不允许数组越界. 数组的一些基本操作: 1.创建数组: func main() { var arr1 = [...]int{1,2,3,4} //[...]默认为元素的数量即为数组的长度 fmt.Println(len(arr1)) //4 arr1[4] = 5 //panic 数组越界 fmt.Println(arr1) var arr2 =

golang 调用顺丰API接口测试

golang 调用顺丰API接口首先得去https://qiao.sf-express.com/pages/service/API.html这个网站申请注册,拿到我的API接口如下图所示 之后就可以按照文档生成xml请求信息 为了方便快速搭建 golang 的结构粘贴如下 type Rquest struct { XMLName xml.Name `xml:"Request"` Service string `xml:"service,attr"` Lang str

详解go语言的array和slice 【二】

上一篇  详解go语言的array和slice [一]已经讲解过,array和slice的一些基本用法,使用array和slice时需要注意的地方,特别是slice需要注意的地方比较多.上一篇的最后讲解到创建新的slice时使用第三个索引来限制slice的容量,在操作新slice时,如果新slice的容量大于长度时,添加新元素依然后使源的相应元素改变.这一篇里我会讲解到如何避免这些问题,以及迭代.和做为方法参数方面的知识点. slice的长度和容量设置为同一个值 如果在创建新的slice时我们把

Linux系统下C语言如何调用scalapack中的函数

在并行计算中经常需要调用scalapck(并行化的lapack)函数库里面的函数进行编程,这里简单介绍在C语言如何调用scalapck中的矩阵向量乘的函数. 注意:scalapack中的函数是用fortran写的,矩阵是按列进行存储的. scalapack的链接需要用到blas,因此确保本机上安装好了blas.gfortran 下面是一个矩阵向量乘法的例子(为了简单计算,该程序中设定进程数为4): #include <stdio.h> #include <string.h> #in

如何在C语言中调用Swift函数

在Apple官方的<Using Swift with Cocoa and Objectgive-C>一书中详细地介绍了如何在Objective-C中使用Swift的类以及如何在Swift中使用Objective-C中的类.在后半部分也介绍了如何在Swift中使用C函数,不过对于如何在C语言中使用Swift函数却只字未提.这里我就为大家分享一下如何在C语言中调用Swift函数. 我们首先要知道的是,所有Swift函数都属于闭包.其次,Swift函数的调用约定与Apple为Clang编译器贡献的B

C语言中调用Lua

C语言和Lua天生有两大隔阂: 一.C语言是静态数据类型,Lua是动态数据类型 二.C语言需要程序员管理内存,Lua自动管理内存 为了跨越世俗走到一起,肯定需要解决方案. 解决第一点看上去比较容易,C语言中有union. 可是第二点呢?万一C语言正引用着Lua的一个值,Lua自动释放了怎么办? 所以就有了一种比union更好的解决方案:栈. 这是一个虚拟的栈,是沟通两者的桥梁,两者的数据交换全都通过这个栈进行,这样只要不pop,Lua就不会自动释放,而什么时候pop由C语言说了算. 下面是一段喜

在Java语言中调用存储过程、存储函数、包头、包体

需要拷贝连接Oracle的jar包,路径如下图所示: 连接Oracle数据库的代码: package demo.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCUtils { private static Stri