• 如果容器中是类,如果要调用sort则需要重载操作符 "<"
  • 包含头文件
     #define _CRT_SECURE_NO_WARNINGS
    #include <vector>
    #include <list>
    #include <algorithm>
    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <iterator>
    using namespace std;
  • 通过结构体vector对象数组与仿函数对对象进行排序
     //vector结构体排序
    struct student
    {
    int score;
    char name[];
    student(int s, char *n)
    {
    score = s;
    strcpy(name, n);
    }
    //需要重载小于运算符来对vector数组进行排序
    bool operator <(const student &s2)
    {
    if (this->score > s2.score)
    {
    return ;
    }
    else
    {
    return ;
    }
    }
    }; void main1()
    {
    vector<student> mylist{ {,""},{,""},{,""},{ ,"" } };
    //取前两名
    partial_sort(mylist.begin(), mylist.begin() + , mylist.end()); for (auto i : mylist)
    {
    cout << i.name <<" " << i.score << endl;
    } cin.get();
    }
  • sort()对数组进行排序,以及取出前三名
     //数组的sort
    {
    vector<int> mylist{ ,,,,, };
    sort(mylist.begin(), mylist.end());
    for (auto i : mylist)
    {
    cout << i << endl;
    }
    }
    cout << endl; //只取一部分(比如对一串数据只取前三名)
    {
    vector<int> mylist{ ,,,,, };
    partial_sort(mylist.begin(), mylist.begin() + , mylist.end());
    for (auto i : mylist)
    {
    cout << i << endl;
    }
    }
  • 全排列,一直对调,随机打乱,一直到升序的时候不能再打乱
     //全排列
    //一直对调,随机打乱,一直到升序的时候不能再打乱
    {
    int a[] = { ,,,, };
    int count = ;
    do
    {
    for (auto i : a)
    {
    cout << i;
    }
    cout << endl;
    count++;
    } while (prev_permutation(a, a + ));
    cout << count << endl;
    }
  • 全排列随机对调,直到降序不能再打乱
     int a[] = { ,,,, };
    int count = ;
    do
    {
    for (auto i : a)
    {
    cout << i;
    }
    cout << endl;
    count++;
    //如果有序,则返回值是零
    } while (next_permutation(a, a + ));
    cout << count << endl;
  • 自动对字符串进行排序
     char *s1 = "book";
    char *s2 = "hello";
    bool res = lexicographical_compare(s1, s1 + strlen(s1), s2, s2 + strlen(s2));
    if (res)
    {
    cout << "s1在s2前面" << endl;
    }
    else
    {
    cout << "s1在s2后面" << endl;
    }
  • 分块排序,小的向左,大 的向右
     //分块排序
    {
    int a[] = { ,,,,,,,,,,,,,, };
    //以a+8为中心,小于向左,大于向右
    nth_element(a, a + , a + );
    for_each(a, a + , [](int x) {cout << x << endl; });
    }
  • 求最大最小
     {
    //求最大值最小值
    int a = max({ ,,,, });
    int b = min({ ,,,, });
    auto it = minmax({ ,,,, });
    cout << a << endl;
    cout << it.first << endl;
    cout << it.second << endl;
    }
  • 判断是全满足还是部分满足还是都不满足
     //all_of  全部满足
    //any_of 至少有一个满足
    //none_of 都不满足
    {
    vector<int> myint{ ,,,, };
    bool isit = all_of(myint.begin(), myint.end(), [](int i)->bool {return i % != ; });
    //类似还有 any_of none_of
    if (isit)
    {
    cout << "OK" << endl;
    }
    else
    {
    cout << "NOT OK" << endl;
    }
    }
  • 条件拷贝
     //copy_if 条件拷贝
    {
    vector<int> v1{ ,,,, };
    vector<int> v2(v1.size());
    auto it = copy_if(v1.begin(), v1.end(), v2.begin(),[](int i) {return i % ; });
    //压缩容器
    v1.resize(distance(v2.begin(), it));
    }
  • 部分排序以后复制到另外一个容器对副本进行操作(局部排序)
     void main22()
    {
    //数组的sort
    {
    vector<int> mylist{ ,,,,, };
    int a[]{ };
    partial_sort_copy(mylist.begin(), mylist.end(), a, a + );
    }
    cin.get();
    }
  • 容器二分查找
     void main3()
    {
    int a[] = { ,,,,,,,,, };
    //默认从小到大
    sort(a, a + , [](int a, int b) {return a < b; });
    for (auto i : a)
    {
    cout << i << endl;
    } //取数组中的最小值
    cout << *min_element(a, a + ) << endl;
    //取数组中的最大值
    cout << *max_element(a, a + ) << endl; //二分查找(必须从小到大)
    auto it = binary_search(a, a + , );
    if (it)
    {
    cout << "find" << endl;
    }
    else
    {
    cout << "not find" << endl;
    }
    cin.get();
    }
  • max min操作
     //取max
    void main4()
    {
    int num1 = max(, );
    int num2 = min(, );
    cout << max((char *)"", (char *)"", [](const char *str1, const char *str2)->bool {return strcmp(str1, str2) < ; }); cin.get();
    }
  • 两个容器归并排序
     //用于归并的字符串模板
    //template<class T>
    //bool greater(T t1, T t2)
    //{
    // return t1 < t2;
    //} //也可以用仿函数
    template<class T>
    class greater
    {
    public:
    bool operator ()(T t1, T t2)
    {
    return t1 < t2;
    }
    };
    //两个数组归并排序
    void main5()
    {
    int a[] = { ,,,,,,,,, };
    int b[]{ , , , , };
    int c[]{ };
    //从大到小排序
    sort(a, a + , [](int a, int b) {return a > b; });
    sort(b, b + , [](int a, int b) {return a > b; });
    //通过lambda
    //merge(a, a + 10, b, b + 5, c, [](int a, int b) {return a > b; }); //通过仿函数
    merge(a, a + , b, b + , c, greater<int>());
    for (auto i : c)
    {
    cout << i << endl;
    }
    cin.get();
    }
  • 判断是否有连续相等区间
     //判断是否是包含关系(要在realease下执行) 必须要连续相等
    void main6()
    {
    int a[] = { ,,,,,,,,, };
    int b[] = { ,,,, };
    bool check = includes(a, a + , b, b + );
    if (check)
    {
    cout << "包含" << endl;
    }
    else
    {
    cout << "不包含" << endl;
    } cin.get();
    }
  • 求两个容器交并集
     //求并集
    void main7()
    {
    int a[] = { ,,,,,,,,, };
    int b[] = { ,,,, };
    //这种操作重复数据会被省略(第一个不重复的后面会被保留)
    /*set_union(a, a + 10, b, b + 5, ostream_iterator<int>(cout, " "));*/
    //这种操作会都保留
    int c[]{ };
    set_union(a, a + , b, b + , c);
    for (auto i : c)
    {
    cout << i << endl;
    }
    cin.get();
    }
  • 把一个数组转化成一个堆
     //把一个数组转成一个堆
    void main8()
    {
    int a[]{ ,,,,,,,,, }; //创建一个堆(创建一个最小堆:顶部值最小)
    make_heap(a, a + , [](int a, int b)->bool {return a > b; });
    for (auto i : a)
    {
    cout << i << endl;
    }
    cout << endl << endl; //将第一个最大元素移动到最后,同时将剩下的元素重新构造成一个新的heap。
    /*pop_heap(a, a + 10);
    for (auto i : a)
    {
    cout << i << endl;
    }
    cout << endl << endl;*/ //堆排序(最小堆sort_heap是从大到小排序,最大堆sort_heap是从小到大排序)
    sort_heap(a, a + ,[](int a, int b)->bool {return a > b; });
    for (auto i : a)
    {
    cout << i << endl;
    }
    cout << endl << endl;
    cin.get();
    }
  • 内部区间归并排序(需要有两个个排序好子列)
     //内部区间归并排序(需要有两个个排序好子列)
    void main9()
    {
    int a[] = { ,,,,,,,,, };
    //inplace_merge(a, a + 5, a + 10);
    int b[] = { ,,,,,,,,, };
    inplace_merge(b, b + , b + , [](int a, int b)->bool {return a > b; });
    for (auto i : b)
    {
    cout << i << endl;
    }
    cin.get();
    }
  • 判断容器是否有序
     //判断是否有序
    void main10()
    {
    int a[] = { ,,,,,,,, };
    if (is_sorted(a, a + ))
    {
    cout << "有序" << endl;
    }
    cin.get();
    }
  • 取出第n大的数据并排好序
     //取出第n大数据并排好序
    void main11()
    {
    int a[] = { ,,,,,,,, };
    nth_element(a, a + , a + );
    for (auto i : a)
    {
    cout << i << endl;
    }
    cin.get();
    }
  • 求出数组中第一个大于(大于等于)某个数的数据
     //求出数组中第一个大于(大于等于)某个数的数据
    void main12()
    {
    //需要有序
    int a[] = { ,,,,,,,,};
    //寻找数组中第一个大于等于的数据
    int *p = lower_bound(a, a + , );
    cout << "last:" << *p << endl; //寻找第一个大于的数据
    int *p2 = upper_bound(a, a + , );
    cout << "last:" << *p2 << endl; for (auto i : a)
    {
    cout << i << endl;
    }
    cin.get();
    }
  • 处理有序数组中的重复序列,红黑树的每一个结点是一个链表
     //处理有序数组中的重复序列,红黑树的每一个结点是一个链表
    void main13()
    {
    int a[] = { ,,,,,,,,, };
    pair<int *, int *> range = equal_range(a, a + , );
    cout << *range.first << endl;
    cout << *range.second << endl;
    for_each(range.first, range.second, [](int x) {cout << x << endl; });
    cin.get();
    }
  • 求两个容器交集差集,以及各自独有的汇总到一起
     //求两个容器交集差集,以及各自独有的汇总到一起
    void main()
    {
    int a[] = { ,,,, };
    int b[] = { ,,,, };
    int c[] = { };
    //求交集
    set_intersection(a, a + , b, b + , c);
    //求差集(a中有b中没有的数据存到d里面)
    int d[]{ };
    set_difference(a, a + , b, b + , d);
    int e[]{ };
    //将a,b各自独有的汇总到一起
    set_symmetric_difference(a, a + , b, b + , e);
    for (auto i : c)
    {
    cout << i << endl;
    }
    cin.get();
    }

30.algorithm排序小结的更多相关文章

  1. 30 algorithm questions study

    April 26, 2015 Spent over a few months to go over 30 questions about algorithm starting from January ...

  2. 1038. Recover the Smallest Number (30) - 字符串排序

    题目例如以下: Given a collection of number segments, you are supposed to recover the smallest number from ...

  3. [Algorithm]排序

    一.排序算法 1.插入排序 1) 直接插入排序:(插入类) 1 void InsertSort( ElemType R[], int n ) 2 { 3 for ( int i = 2; i < ...

  4. <Data Structure and Algorithm>排序算法

    排序稳定:如果两个数相同,对他们进行的排序结果为他们的相对顺序不变.例如A={1,2,1,2,1}这里排序之后是A = {1,1,1,2,2} 稳定就是排序后第一个1就是排序前的第一个1,第二个1就是 ...

  5. 排序小结(C++版)

    一.快速排序 #include <iostream> using namespace std; int adjust(int a[],int start,int end) { int i, ...

  6. 排序小结(C版)

    一.快速排序(C源码) #include <stdlib.h> #include <stdio.h> int adjust(int a[],int start,int end) ...

  7. Java 多条件复杂排序小结

    前言 今天下午做了拼多多在牛客网上的在线笔试题,感觉自己的智商被鄙视到了···不过其中一道题的某一部分引起了我极大的兴趣,感觉可以总结一下,做好积累~ 题目的部分我拍照如下所示 这里面最复杂的就是第3 ...

  8. 30:根据排序标识flag给数组排序

    题目描述:输入整型数组和排序标识,对其元素按照升序或降序进行排序 接口说明 原型: void sortIntegerArray(Integer[] pIntegerArray, int iSortFl ...

  9. Shell脚本编程30分钟入门(小结)(转)

    原文链接https://www.jb51.net/article/161028.htm 什么是Shell脚本 Shell脚本(英语:Shell script),又称Shell命令稿.程序化脚本,是一种 ...

随机推荐

  1. [Angular] Provide Feedback to Progress Events with Angular’s HttpRequest Object

    In some cases your application might need to upload large amounts of data, such as files. Obviously ...

  2. FPGA实现网络通信时的网络字节序问题

    在上位机软件发送字符abcd 在鲨鱼上抓包 用逻辑分析仪从FPGA网络接收管脚分析 数据接收后存储在位宽为8bit的ram中 从ram中读32bitUDP数据为 64636261 依据以上那个现象, ...

  3. 关于Thread的那些事

    关于Thread的那些事 1 : 你能够调用线程的实例方法Join来等待一个线程的结束.比如: public static void MainThread() { Thread t = new Thr ...

  4. JDBC-连接数据库代码

    package com.zxc.connection; import java.sql.Connection; import java.sql.DriverManager; public class ...

  5. javaweb学习总结(六)——Servlet开发(三) 常见问题疑问

    [1]response.getWriter().write()与out.print()的区别http://blog.csdn.net/javaloveiphone/article/details/81 ...

  6. Testbench的编写

    Testbench的作用,在于给我们编写的可综合代码的模块送入激励.即在我们波形仿真中用编写testbench来代替拖拽波形.其中还包括了我们硬件仿真与matlab仿真的联调建立(将matlab产生的 ...

  7. bzoj4868: [Shoi2017]期末考试(三分法)

    4868: [Shoi2017]期末考试 题目:传送门 题解: Get到一个新姿势...三分法 一开始百度百科的时候下了一跳...中国...的根??? 学懂了之后其实运用起来就根二分差不多啊,不过证明 ...

  8. SSH Key的生成和使用(for git)

    SSH Key的生成和使用 一.总结 1.用git base生成ssh,会生成id_rsa.pub文件,还有一个私钥文件.     $ ssh-keygen -t rsa -C “youremailn ...

  9. SSRS参数不能默认全选的解决方法

    解决方法选自<SQL Server 2008 R2 Reporting Services 报表服务>一书,亲测有效. 注意:参数默认值如果是字符串需要类型转换 =CStr("AL ...

  10. e.Row.Attributes.Add

    其实看到属性这个单词,还有点发憷呢,C#里面有个关键词是Attributes, 搞了半天貌似没有弄清楚 e.Row.Attributes.Add()函数的介绍,包括参数,什么是Attributes 就 ...