作者:王东阳
前言
在计算机科学中,排序和二分搜索是非常常见的一种算法,在上篇文章leveldb memdb源码分析(下)之Rust实现篇中,就可以看到里面很多方法都用到了二分搜索来实现。本文将会对比 Go 和 Rust 语言中排序和搜索方法中的一些特性和不同,对于Go主要使用数字切片 []int 作为例子, 对于 Rust 主要使用 Vec 作为例子 。
排序
在Go语言中,对于 []int 我们可以直接使用 sort.Ints 进行排序如下:
func sort_simple() {
a := []int{
1, 2, 6, 7, 8, 3, 4}
sort.Ints(a)
fmt.Println(a)
}
在 Rust 中,对于 Vec 可以使用 sort 方法进行排序如下:
fn sort_simple() {
let mut a = vec![1, 2, 6, 7, 8, 3, 4];
a.sort();
println!("{:?}", a);
}
如果希望自定义排序规则,在Go中我们可以使用 sort.Slice ,实现逆序排序或基于绝对值等特定规则的排序,如下:
func sort_reverse() {
a := []int{
1, 2, 6, 7, 8, 3, 4}
sort.Slice(a, func(i, j int) bool {
return a[i] > a[j]
})
fmt.Println(a)
}
func sort_abs() {
a := []int{
1, -2, 6, 7, -8, 3, 4}
sort.Slice(a, func(i, j int) bool {
return abs(a[i]) > abs(a[j])
})
fmt.Println(a)
}
func abs(i int) int {
if i > 0 {
return i
}
return -i
}
在Rust中则可以使用 sort_by来自定义排序
fn sort_reverse() {
let mut a = vec![1, 2, 6, 7, 8, 3, 4];
a.sort_by(|a, b| b.cmp(a));
println!("{:?}", a)