5.2.2. 浮点数 Vector 排序

std-badge cat-science-badge

问题:

你想对浮点类型的动态数组 vector 进行排序。

解决方案:

f32 或 f64 的 vector,可以使用 vec::sort_byPartialOrd::partial_cmp 对其进行排序。

以下实例代码引用自开源书籍项目《Cookin’ with Rust》,笔者在其基础上稍作修改。

fn main() {
    let mut vec = vec![1.1, 1.15, 5.5, 1.123, 2.0];
    println!("  排序前: {:?}", vec);

    vec.sort_by(|a, b| a.partial_cmp(b).unwrap());
    println!("  排序后: {:?}", vec);

    assert_eq!(vec, vec![1.1, 1.123, 1.15, 2.0, 5.5]);
}

代码第 5 行,使用 PartialOrd::partial_cmp 对浮点型 vector 进行排序。

构建并运行后,结果大抵如下所示。

  排序前: [1.1, 1.15, 5.5, 1.123, 2.0]
  排序后: [1.1, 1.123, 1.15, 2.0, 5.5]

断言的使用和整型 vector 排序类似,不再赘述。

讨论:

vec::sort_by 使用比较器(comparator )函数对切片进行排序,这种排序是稳定的(即不重新排序相等的元素)。比较器(comparator )函数必须为切片中的元素定义一个总顺序。如果不是全序关系排序,则不指定元素的顺序。如果排序是全序关系(对于所有 abc),则:

  • 完全反对称:a < ba == ba > b 中的一个为真,并且
  • 等量代换:a < bb < c 意味着 a < c。对于 ==>,同样具有等量代换关系。

使用 PartialOrd::partial_cmp时,如果存在其它值(other ),此方法将返回自己(self)其它值(other )之间的排序。