1. 程式人生 > >sort()+結構體+多重排序

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函式等的這些步驟了。