使用函数指针的 Introsort(内省排序) - MetaTrader 5 库


内省排序
这是一个修改 的版本 原始 Introsort 库,现在Introsort() 函数接受指向自定义比较函数的可选函数指针。
介绍或内省排序是一种提供快速性能的混合排序算法。它是一种基于三个阶段的基于比较的排序算法。它使用快速排序以及堆排序和插入排序算法。
快速排序
快速排序是一种分而治之的算法,其工作原理是选择数组中的一个主元,然后将其他元素划分为两个子数组,检查元素是否大于或小于。平均而言,快速排序算法需要 O(nlog(n)) 时间,最坏情况复杂度为 O(n2)。
堆排序
堆排序算法是一种基于二叉堆的比较排序方法。它是一种不稳定的排序算法,最坏情况和平均情况时间复杂度为 O(nlog(n)),最好情况时间复杂度为 O(n)。
插入排序
插入排序算法是一种简单的排序方法,一次构建最终的排序数组。最坏情况和平均情况的时间复杂度为 O(n2),最好的情况是 O(n)。
Introsort算法结合了这三种算法的优点。它从快速排序开始,当递归深度超过基于开始排序的元素数量的级别时,切换到堆排序,当元素数量小于某个阈值时,切换到插入排序。
Introsort 具有特别好的运行时行为。它是当今使用的最快的比较排序算法之一,并且是 C++ STL、Microsoft .NET Framework 类库、GNU 标准 C++ 库和 LLVM libc++ 库提供的 std::sort 算法的通常实现。
http://en.wikipedia.org/wiki/Introsort
https://iq.opengenus.org/intro-sort/
//+------------------------------------------------------------------+ //|简介 | //+------------------------------------------------------------------+ /** * 使用 less 比较函数对输入数组进行就地排序。 * 您可以指定自己的比较函数。如果没有函数 * 指定,使用升序排序。 */ 模板<类型名>空白Introsort(T &arr[]);//+------------------------------------------------------------------+ //|使用指向自定义 Less() 函数的指针进行 Introsort。 | //|自定义 Less() 函数采用两个参数并包含逻辑 | //|决定它们在排序数组中的相对顺序。这个想法是 | //|提供灵活性,以便 Introsort() 可用于任何 | //|类型(包括用户定义的类型,如对象或结构) //|并可用于获取任何所需的排序顺序(升序、 | //|结构字段的降序或自定义顺序)。 | //+------------------------------------------------------------------+ 模板<类型名吨,类型名少功能>空白Introsort(T &arr[], LessFunc pfnLess);
比较函数少:
您可以指定自己的比较函数。如果未指定函数,则使用升序排序。自定义 Less() 函数采用两个参数并包含决定它们在排序数组中的相对顺序的逻辑。这个想法是提供灵活性,以便 Introsort() 可用于任何类型(包括用户定义的类型),并可用于获取任何所需的顺序(递增、递减或任何其他)。例如,要按自定义排序顺序对对象或结构(用户定义的类型)数组进行排序:
布尔值我的LessFunc(常量我的结构 &x,常量我的结构 &y) {//--- 按 A 排序 (asc) 如果(x.A < y.A)返回(真的); 如果(x.A > y.A)返回(错误的);//--- 如果 A 相等,则按 B 排序 (asc) 如果(x.B < y.B)返回(真的); 如果(x.B > y.B)返回(错误的);//--- 如果 B 相等,则按 C 排序 (asc) 如果(x.C < y.C)返回(真的); 如果(x.C > y.C)返回(错误的);//--- 所有键都相等 返回(错误的); }// 定义自定义 Less 函数的指针类型。 类型定义 布尔值(*pLess)(常量我的结构 &x,常量我的结构 &y);// 使用自定义 Less 函数对结构数组进行排序。Introsort(structArray, (pLess)MyLessFunc);
用于对结构数组进行排序的便捷宏(例如 MqlRates):
//+------------------------------------------------------------------+ //|方便的宏,可按字段对“T”类型的数组进行排序 | //+------------------------------------------------------------------+ #定义INTROSORT_STRUCT(T,数组,字段) //+------------------------------------------------------------------+ //|方便的宏,可按两个字段对“T”类型的数组进行排序 | //+------------------------------------------------------------------+ #定义INTROSORT_STRUCT_2(T,数组,F1,F2)
附件下载
📎 Introsort.mqh (21.58 KB)
📎 Introsort_benchmark.mq5 (3.23 KB)
📎 sort_simple_array.mq5 (2.51 KB)
📎 sort_MqlRates.mq5 (3.46 KB)
📎 sort_MqlRates_macro.mq5 (1.86 KB)
📎 sort_struct_array_custom.mq5 (4.56 KB)
📎 sort_object_ptrs_array.mq5 (4.88 KB)
Source: MQL5 #57233
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
