最近有点浮躁,无心练题,便捣鼓了一阵子的C++。接触了一点点的重载和模板后,心血来潮想写一点牛逼点的东西。因为平时打编程比赛要排序的地方都是直接用的C++中自带的sort排序函数,就想自己也写一个跟它功能差不多的sort函数(事实上写完后差远了)。折腾了两个小时,总算是写出了一个差强人意的代码。
  C++算法库里的sort函数功能极其强大,据我所知它可以根据数据量实时选用不同的排序方式。很显然我这种蒟蒻是不会这种方式的。所以我的sort函数一整个就是一个非递归的归并排序。等以后更强大了再试着把它弄成更高级的函数吧~
  按照惯例,先贴代码,再简要解释部分地方的代码实现。

#ifndef SORT_H
#define SORT_H#include <iostream>template<typename T, typename U>
void sort(T* begin, T* end, U op)
{unsigned int N = end - begin;T* Tmp = new T[N];for (unsigned int l = 1; l < N; l *= 2) {for (unsigned int i = 0; i + l - 1 < N; i += 2 * l) {int s = i, m = i + l - 1, e = N - 1 > i + 2 * l - 1 ? i + 2 * l - 1 : N - 1, pb = 0;int p1 = s, p2 = m + 1;while (p1 <= m && p2 <=e) {if (op(begin[p1], begin[p2]))Tmp[pb++] = begin[p1++];elseTmp[pb++] = begin[p2++];}while (p1 <= m) Tmp[pb++] = begin[p1++];while (p2 <= e) Tmp[pb++] = begin[p2++];for (int i = 0; i < e - s + 1; ++ i) {begin[s + i] = Tmp[i];}}}delete []Tmp;
}
template<typename T>
void sort(T* begin, T* end)
{sort(begin, end, [](T a, T b){return a < b;});
}#endif

  为了证明我写的函数的可用性,还特意用它写了一遍洛谷的排序的板题:

最大的数据点38ms,还算不错,之前用C++库里的sort写的好像也就是36ms,差不多啦。

函数使用方式

  由于我的函数中临时新开了一个数组,而这个数组类型由模板T决定,这导致了我不能把T直接定为指针类型,只能定成T类型(因为T = new T[len]中的T必须是非指针型的),这也就造成了我的sort的形参只能传地址而不能传迭代器(例如vector中的iterator)。所以目前它只能给普通的数组、结构体数组和类对象数组排序,后续我将寻找解决方案,并更新代码。

·函数各参数

  该函数该传入的参数为某一数组待排序列的最左端地址及最右端地址右移一位(与C++sort函数的左闭右开性质相同)。第三个参数为可选参数,用户可自行定义排序逻辑,具体方法请往下看。

·对数组进行排序

  1.  以下默认是从小到大排序:
 int a[] = {7, 5, 4, 6, 8, 9};  //数组长度是6sort(a, a + 6);   //遵循左闭右开原则
  1. 实现从大到小排序,有四种方法:
 int a[] = {7, 5, 4, 6, 8, 9};  //数组长度是6sort(a, a + 6, greater<int>() );  //仿函数,C++自带
bool cmp(int a, int b) {return a > b;
}
int main()
{int a[] = {7, 5, 4, 6, 8, 9};  //数组长度是6sort(a, a + 6, cmp);   //自定义比较函数for (int i = 0; i < 6; i ++)cout << a[i] << ' ';return 0;
}
 int a[] = {7, 5, 4, 6, 8, 9};  //数组长度是6sort(a, a + 6, [](int a, int b){ return a > b;}); //利用C++的lambda函数
class cmp {public:bool operator() (int &a, int &b) const {return a > b;}
};
int main()
{int a[] = {7, 5, 4, 6, 8, 9};  //数组长度是6sort(a, a + 6, cmp() ); //利用类的仿函数return 0;
}

·对结构体数组和对象数组排序

  在C++里,结构体就相当于成员权限均为public的类。所以,接下来的举例我均用结构体来写。
  结构体由于不能直接比较大小,所以不能直接排序。用户在给结构体排序的时候,需要自行做一些处理。
  假设我们现在有一个这样的结构体数组:

 假设我们的排序原则是num1小的排在前,num1相同的num2小的排在前。那么,我们可以用三种方法进行排序:

  1. 对结构体进行符号重载,注意要重载<
struct node {int num1;int num2;bool operator< (node &a) const {if(num1 == a.num1)return num2 < a.num2;return num1 < a.num1;}
}a[1000];
int main()
{sort(a, a + 1000);return 0;
}
  1. 自定义比较函数
struct node {int num1;int num2;
}a[1000];
bool cmp(node &a, node &b) {if(a.num1 == b.num1)return a.num1 < b.num1;return a.num2 < b.num2;
}
int main()
{sort(a, a + 1000,cmp);return 0;
}
  1. lambda隐匿函数
struct node {int num1;int num2;
}a[1000];
int main()
{sort(a, a + 1000,[](node &a, node &b) {if(a.num1 == b.num1) return a.num2 < b.num2;return a.num1 < b.num1; } );return 0;
}
  1. 仿函数
struct node {int num1;int num2;
}a[1000];
struct cmp {bool operator()(node &a, node &b) const {if(a.num1 == b.num1)return a.num2 < b.num2;return a.num1 < b.num1;}
};
int main()
{sort(a, a + 1000, cmp() );return 0;
}


功能大概就是这些。日后我会慢慢将它变得更加完善。

自写sort排序函数(支持重载排序规则)相关推荐

  1. C语言基础 --使用指针数组存储若干英文书名,调用排序函数将其排序后输出

     思路:这道题重点是在于你对指针数组是否有足够清晰的认知,并对指针数组的动态内存原理有一定理解 原理:1. 首先,我们需要定义一个指针数组 bookname,用来存储若干本英文书的书名.在实际的编程过 ...

  2. python3 自定义排序函数_Python自定义排序函数

    Python内置的 sorted()函数可对list进行排序: >>> sorted([36, 5, 12, 9, 21]) [5, 9, 12, 21, 36] 可以看到,sort ...

  3. mysql 自定义排序函数_MySQL自定义排序函数FIELD()

    MySQL可以通过field()函数自定义排序,格式:field(value,str1,str2,str3,str4),value与str1.str2.str3.str4比较,返回1.2.3.4,如遇 ...

  4. oracle排序函数性能,oracle排序函数

    rank,dense_rank,row_number,以及分组排名partition rank:排名会出现并列第n名,它之后的会跳过空出的名次,例如:1,2,2,4 dense_rank:排名会出现并 ...

  5. 设定关系(A=1,B=2,C=3,···,Z=26,AA=27,AB=28,···,AAA=XXX,···),写一个转换函数,根据上面规则把一个字符串转换为数字。

    这是一道进制转换问题,将10进制转换为26进制. ​#include<iostream> #include<string> using namespace std;int St ...

  6. C++中sort()排序函数应用

    ** C++中sort()排序函数应用 ** sort(first_pointer,first_pointer+n,cmp) 该函数可给数组,或者链表list.向量排序. 实现原理:sort并不是简单 ...

  7. python中sorted函数的作用_Python中排序方法sort、函数sorted的key参数的作用分析

    从Python2.4开始,list.sort方法 和 sorted方法 都增加了一个 'key' 参数用来在进行比较之前指定每个列表元素上要调用的函数,将函数的返回值作为比较的依据. 那么怎么使用这个 ...

  8. Oracle中的排序和排序函数的使用

    参考地址:https://www.cnblogs.com/qiuting/p/7880500.html 前排提示,下面的实例用到的hr.employees表是Oracle11g的orcl实例自带的表空 ...

  9. 【Python】自定义排序函数 - 示例

    自定义排序函数 - 示例 自定义排序规则: def cmp_value_p_code_big(o1, o2):"""排序规则: value大,排前面"" ...

最新文章

  1. 2021年大数据Spark(十二):Spark Core的RDD详解
  2. Python学习教程:Python爬虫抓取技术的门道
  3. python中并发编程基础1
  4. ThinkPHP3.1快速入门(2)数据CURD
  5. Java中如何实现每天定时对数据库的操作
  6. e.target与e.e.srcElement
  7. Mastering The Mix Total Bundle 2021 Mac - 混音插件合集
  8. 关于asp.net页面缓存
  9. 计算机科学技术学习引论
  10. 什么是公网IP和内网IP?
  11. 别说理科男不懂撩妹,这个老司机一生只爱两样:物理和18岁的少女
  12. Elasticsearch 时间类型总结
  13. cocoscreator利用中点位移算法制作闪电
  14. 算法初步 计算机程序,算法初步-程序框图
  15. android mediaplayer 实现歌曲边播放边下载
  16. python练习6——基础训练(mm追mhc)
  17. 本人从事Java十余年~是时候收徒弟~包教包会~深藏功与名~
  18. unity富文本使用:同一个文本框展示不同样式字体
  19. 线性代数(15)——矩阵的QR分解
  20. 电脑常识——host文件修改(屏蔽网站或解开屏蔽)

热门文章

  1. Mit6.S081学习记录
  2. Flex之AdvancedDataGrid用法
  3. java零基础多久能学会_小白学java大概需要多久 零基础学起来难么
  4. 输入一串字符,统计每个字符数,用字典输出。
  5. 我知道的几个免费的API数据接口
  6. docker部署微服务
  7. Unity3D射击类游戏制作第一节--场景搭建
  8. qq聊天纪录被删除应该如何恢复
  9. java robot api_java机器人API学习笔记
  10. WebService的简单案例记录(Java)