sort()+结构体+多重排序

用法

1sort函数可以三个参数也可以两个参数,必须的头文件#include < algorithm>using namespace std; 
2
、它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n)

3Sort函数有三个参数:(第三个参数可不写)

1)第一个是要排序的数组的起始地址。

2)第二个是结束的地址(最后一位要排序的地址)

3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。

两个参数用法

#include <iostream>

#include <algorithm>

Using namespace std;

int main()

{

 int a[20]={2,4,1,23,5,76,0,43,24,65},i;

 for(i=0;i<20;i++)

  cout<<a[i]<<endl;

 sort(a,a+20);

 for(i=0;i<20;i++)

 cout<<a[i]<<endl;

 return 0;

}

上面我在网上找的比较清楚的代码

三个参数用法(cmp函数)

#include <iostream>

#include <algorithm>

Using namespace std;

Bool cmp(int a,int b)//从大到小排序

{

        If(a<b)

        Return false;//a如果比b小,就返回false就是说要调换这两个的位置

        Else

        Return true;//否则不动

}

int main()

{

 int a[20]={2,4,1,23,5,76,0,43,24,65},i;

 for(i=0;i<20;i++)

  cout<<a[i]<<endl;

 sort(a,a+20cmp());

 for(i=0;i<20;i++)

 cout<<a[i]<<endl;

 return 0;

}

多重排序(这是我标的深入探究)

 

下面是nyoj上一题三重排序 以此为例

一种排序

时间限制:3000 ms  |  内存限制:65535 KB

难度:3

描述

现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);

1.按照编号从小到大排序

2.对于编号相等的长方形,按照长方形的长排序;

3.如果编号和长都相同,按照长方形的宽排序;

4.如果编号、长、宽都相同,就只保留一个长方形用于排序,删除多余的长方形;最后排好序按照指定格式显示所有的长方形;

输入

第一行有一个整数 0<n<10000,表示接下来有n组测试数据;
每一组第一行有一个整数 0<m<1000,表示有m个长方形;
接下来的m行,每一行有三个数 ,第一个数表示长方形的编号,

第二个和第三个数值大的表示长,数值小的表示宽,相等
说明这是一个正方形(数据约定长宽与编号都小于10000);

输出

顺序输出每组数据的所有符合条件的长方形的 编号

样例输入

1

8

1 1 1

1 1 1

1 1 2

1 2 1

1 2 2

2 1 1

2 1 2

2 2 1

样例输出

1 1 1

1 2 1

1 2 2

2 1 1

2 2 1

 

 

可以看到我们需要对结构体中的各个不同的数据按照优先级进行排序

代码是我匆忙写的不够规整

 

#include<iostream>

#include<stdio.h>

#include<algorithm>

using namespace std;

 

struct cfx{

    int num;

    int l;

    int k;

    } a[1002];

 

bool cmp(cfx a,cfx b)

{

    if(a.num<b.num)//当a.num<b.num的时候

        return true;

    else if(a.num==b.num)//当他们相同时的情况

    {

        if(a.l<b.l)

            return true;//同上上

        else if(a.l==b.l)

        {

            if(a.k<b.k)//如果num相同,l相同,只需比较k;

                return true;

            else

                return false;

        }

        else return false;

    }

    else

        return false;

}

int main()

{

    int n;

    scanf("%d",&n);

    while(n--)

    {

        int m;

        cin>>m;

        for(int i = 1 ; i <= m ; i ++)

        {

            int x,y,z;

            cin>>x>>y>>z;

            a[i].num=x;

            if(y<z)

            {

                a[i].l=z;

                a[i].k=y;

            }

            else

            {

                a[i].l=y;

                a[i].k=z;

            }

        }

        sort(a+1,a+1+m,cmp);

        printf("%d %d %d\n",a[1].num,a[1].l,a[1].k);

        for(int i=2;i<1+m;i++)

        {

            if(a[i].num!=a[i-1].num||a[i].l!=a[i-1].l||a[i].k!=a[i-1].k)

            printf("%d %d %d\n",a[i].num,a[i].l,a[i].k);

        }

 

    }

    return 0;

}

在学习数据结构之后才会对sort()有比较深的理解,暂时还没有学习过的就需要记住cmp函数等的这些步骤了。

猜你喜欢

转载自blog.csdn.net/masterwu1/article/details/82390330
今日推荐