欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

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

author emer | 488 人阅读 | 0 人评论 |

Introsort (Introspective sort) using Function Pointers - library for MetaTrader 5

Introsort (Introspective sort) using Function Pointers - library for 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 (Introspective sort) using Function Pointers - library for MetaTrader 5


附件下载

📎 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

🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录