zoukankan      html  css  js  c++  java
  • 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排序方法目前就介绍到这里了。

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

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



    透过泪水看到希望
  • 相关阅读:
    [I cannot be cast to java.lang.Comparable
    关于有参构造的调用问题
    方法中的参数问题
    mybatis中xml的sql语句传入参数的不同用的#{}中的参数也不相同
    javaweb中向集合中添加对象报空指针异常问题的可能原因
    找不到log4j类的问题可能的原因
    快速失败和安全失败(别人写的,摘抄过来了)
    自动生成的列在xml中写sql代码插入时不写入,但是其余属性要都列出来
    JQ高级
    JQ初级
  • 原文地址:https://www.cnblogs.com/ronnielee/p/9495156.html
Copyright © 2011-2022 走看看