• STL的sort排序


    STL的sort排序

    日常我们在对数据处理时,经常会用到排序算法。其中,sort排序的由于简洁高效等特点深受人们喜爱(时间复杂度仅为O(NlogN)。下面简单介绍sort排序。

    头文件

    #include<algotirhm>

    下面依次介绍sort排序在普通一维数组、结构体以及在类中的应用。

    一维数组中的应用

    对于从data【N】,假设data数组从data【0】开始赋值并对前n个值排序:

    sort(data,data+n);

    假设data数组从data【1】开始赋值并对前n个值排序:

    sort(data+1,data+n+1);

    假设data数组需要对data【a】及其后面的数,总共b个,进行排序:

    sort(data+a,data+b);

    结构体中的应用

    推荐博主前面的文章。一道水题,用结构体进行排序。

    https://blog.csdn.net/ronnie14165/article/details/80790781

    核心代码贴一下:

    struct milk
    {
    int cost;
    int num;
    }p[N];
    bool cmp(milk x,milk y)
    {
    	return x.cost < y.cost;
    }
    ...
    sort(p,p+man_num,cmp);

    类中的应用

    对类的不同对象以不同的顺序进行排序。其中,以背包为类创造两个对象,价值以及数量。

    以价值为标准进行排序:通过重载运算符<,对于背包的价值直接用sort(vec.begin(),vec.end());进行排序。

    以数量为标准进行排序:通过定义比较函数,对于背包的数量直接用sort(vec.begin(),vec.end(),by_amount);进行排序。

    PS:解释一下奇怪的数据knapsack temp(3*i+1,3*i*i-30*i+100),博主不想让背包的价值和数量在输入上就呈正相关,就构造了一个极点在区间内的二次函数。

    #include<iostream>
    #include<algorithm>
    #include<vector>
    using namespace std;
    class knapsack
    {
    public:
        knapsack(int a,int b):value(a),amount(b){	}
        int value,amount;
        bool operator < (const knapsack &x) const{return value<x.value;}
    };
    bool by_amount(const knapsack & x,const knapsack & y)
    {return x.amount<y.amount;}
    bool by_amount_large_to_small(const knapsack & x,const knapsack & y)
    {return x.amount>y.amount;}
    int main()
    {
    	vector<knapsack> vec;
    	for(int i = 0 ; i < 10 ; i++)
    	{
    		knapsack temp(3*i+1,3*i*i-30*i+100);
    		vec.push_back(temp);
    	}
    	cout << "Print the original sequence"<<endl;
    	for(int i = 0 ; i < 10 ; i++)
    	cout << "(" << vec[i].value << " ," << vec[i].amount << ")" <<endl;
    	sort(vec.begin(),vec.end());
    	cout << "Sort by value from small to large"<<endl;
    	for(int i = 0 ; i < 10 ; i++)
    	cout << "(" << vec[i].value << " ," << vec[i].amount << ")" <<endl;
    	sort(vec.begin(),vec.end(),by_amount);
    	cout << "Sort by amount from small to large"<<endl;
    	for(int i = 0 ; i < 10 ; i++)
    	cout << "(" << vec[i].value << " ," << vec[i].amount << ")" <<endl;
    	sort(vec.begin(),vec.end(),by_amount_large_to_small);
    	cout << "Sort by amount from large to small"<<endl;
    	for(int i = 0 ; i < 10 ; i++)
    	cout << "(" << vec[i].value << " ," << vec[i].amount << ")" <<endl;
        return 0;
    }

    输出:

    (7 ,52)
    (10 ,37)
    (13 ,28)
    (16 ,25)
    (19 ,28)
    (22 ,37)
    (25 ,52)
    (28 ,73)
    Sort by value from small to large
    (1 ,100)
    (4 ,73)
    (7 ,52)
    (10 ,37)
    (13 ,28)
    (16 ,25)
    (19 ,28)
    (22 ,37)
    (25 ,52)
    (28 ,73)
    Sort by amount from small to large
    (16 ,25)
    (13 ,28)
    (19 ,28)
    (10 ,37)
    (22 ,37)
    (7 ,52)
    (25 ,52)
    (4 ,73)
    (28 ,73)
    (1 ,100)
    Sort by amount from large to small
    (1 ,100)
    (4 ,73)
    (28 ,73)
    (7 ,52)
    (25 ,52)
    (10 ,37)
    (22 ,37)
    (13 ,28)
    (19 ,28)
    (16 ,25)

    对于sort排序方法目前就介绍到这里了。

    这篇博文现在还不够完善,明天再更一下。

    写在最后,希望博主能够保持自我,暑训加油啦!



    透过泪水看到希望
  • 相关阅读:
    JAVA正则表达式matcher.find()和 matcher.matches()的区别
    Mysql面试题
    Mysql常见的错误码
    关于Spring的69个问题
    Exception总结
    JDK5-8特性归纳
    TCP和UDP的区别
    log4j介绍和使用
    tomcat项目中配置数据库连接池
    Mybatis简介、环境搭建和详解
  • 原文地址:https://www.cnblogs.com/ronnielee/p/9495156.html
Copyright © 2020-2023  润新知