pdqsort是基于std::sort的改进算法,当数据量小的时候用插入排序,递归深度大的时候用heapsort,其他情况用改良的quicksort
go// pdqsort 对数据 data[a:b] 进行排序。
// 该算法基于 pattern-defeating quicksort (pdqsort),但没有 BlockQuicksort 中的优化。
// pdqsort 论文:https://arxiv.org/pdf/2106.05123.pdf
// C++ 实现:https://github.com/orlp/pdqsort
// Rust 实现:https://docs.rs/pdqsort/latest/pdqsort/
// limit 是在陷入堆排序之前允许的坏(非常不平衡)枢轴的数量。
func pdqsort(data Interface, a, b, limit int) {
const maxInsertion = 12
container包定义了一套heap的接口,只要实现了这些接口就能作为一个heap来使用,定义如下
go// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// heap 包为任何实现 heap.Interface 接口的类型提供堆操作。堆是一种具有以下特性的树形结构,
// 即每个节点都是其子树中值最小的节点。
//
// 树中的最小元素是根,索引为 0。
//
// 堆通常用于实现优先队列。要构建优先队列,请使用 (负) 优先级作为 Less 方法的排序,
// 这样 Push 就会添加项目,而 Pop 就会从队列中删除优先级最高的项目。
// 示例包括了这样一个实现;文件 example_pq_test.go 包含了完整的源代码。