STL -- sort 함수 안내

8080 단어 sort
참고: http://blog.csdn.net/s030501408/article/details/5329477
0) C 표준 라 이브 러 리 qsort 와 의 비교: http://bbs.csdn.net/topics/330202688
std:: sort () 가 C 표준 라 이브 러 리 qsort 보다 빠 른 것 은 긍정 적 이 고 두 배 빠 를 수 있다 는 점 에 대한 해석 은 두 가지 가 있 으 며 STL 의 소스 코드 에서 도 확인 되 었 다.
하 나 는 sort 가 빠 른 정렬 이 아니 라 다양한 정렬 의 결합 이라는 점 을 확인 할 수 있 습 니 다. STL 의 sort 소스 코드 에서 빠 른 정렬, 쌓 기 정렬, 병합 정렬 등 여러 가지 정렬 방식 의 결합 을 볼 수 있 습 니 다. 그러나 qsort 는 효율 적 으로 도 최적화 되 었 습 니 다. 일반적인 빠 른 배열 보다 훨씬 빠 르 고 세 가지 정렬 의 결합 은 STL 의 sort 가 qsort 보다 한 배 빠 를 수 없 습 니까?더 많은 설 은 qsort 의 마지막 매개 변수 리 셋 함수 의 영향 을 여러 번 호출 한 결과 입 니 다.이것 도 틀림없이 지출 이 있 을 것 이다. 그러나 내 연 을 사용 하 는 것 은 효율 적 인 향상 이 아니다.많은 이론 적 인 견 해 는 실천 에서 여러 가지 요소 의 방 해 를 받 으 면 종종 모양 이 변 한다.그래, 간단 한 일: 작은 프로그램 을 써 서 테스트 해 보 자...
 
 
 
STL 안에 sort 함수 가 있 는데 복잡 도 는 n * log 2 (n) 입 니 다.이 함 수 를 사용 하려 면 헤더 파일 (\ # include < algorithm >) 을 포함 해 야 합 니 다.
1) 형식:
이 함 수 는 두 개의 인자 나 세 개의 인 자 를 전달 할 수 있다.첫 번 째 매개 변 수 는 정렬 할 구간 의 첫 번 째 주소 이 고 두 번 째 매개 변 수 는 구간 끝 주소 의 다음 주소 이 며 기본 적 인 정렬 방식 은 오름차 입 니 다.
쉽게 말 하면 하나의 배열 int a [100] 가 있 습 니 다. a [0] 에서 a [99] 까지 의 요 소 를 정렬 하려 면 sort (a, a + 100) 만 쓰 면 됩 니 다.
벡터 v 정렬: sort (v. begin (), v. end ();
문자열 클래스 string 정렬: sort (strings, strings + 100, cmp).(cmp 함수 정의 "연산 보다 작 음" 이 필요 합 니 다: bool cmp (string a, string b) {return a < b;}, \ # include < string >)
2) 세 번 째 인자: 
정렬 된 데이터 형식 은 정수 에 국한 되 지 않 습 니 다. 연산 보다 작은 데이터 형식 을 정의 하지 않 거나 정렬 순 서 를 바 꾸 려 면 세 번 째 매개 변수 인 비교 함 수 를 사용 해 야 합 니 다.
비교 함 수 는 자신 이 정의 한 함수 입 니 다. 반환 값 은 bool 형 입 니 다. 어떤 관계 가 '작은' 인지 규정 합 니 다.
방금 정수 배열 을 내림차 순 으로 배열 하려 면 비교 함수 cmp bool cmp (int a, int b) {를 정의 할 수 있 습 니 다.    return a>b; }    정렬 할 때 sort (a, a + 100, cmp) 를 씁 니 다.
3) 하나의 인 스 턴 스:

# include<iostream>

using namespace std;

 

# include<string.h>

# include<algorithm>//for STL

 

struct Node

{

    char number[7];

    char name[9];

    int score;

};

 

bool Cmp1(Node a, Node b)

{

    return strcmp(a.number, b.number) < 0;

}

bool Cmp2(Node a, Node b)

{

    if (strcmp(a.name, b.name) != 0)

    {

        return strcmp(a.name, b.name) < 0;

    }

    return strcmp(a.number, b.number) < 0;

}

bool Cmp3(Node a, Node b)

{

    if (a.score != b.score)

    {

        return a.score < b.score;

    }

    return strcmp(a.number, b.number) < 0;

}

 

Node node[100000];

 

int main()

{

    int n, c, i, count = 1;

    //Node node[100000];

    while (cin >> n >> c)

    {

        if (n == 0)

        {

            return 0;

        }

        else

        {

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

            {

                cin >> node[i].number >> node[i].name >> node[i].score;

            }

             

            switch (c)

            {

            case 1:

            {

                      sort(node, node + n, Cmp1);

                      break;

            }

            case 2:

            {

                      sort(node, node + n, Cmp2);

                      break;

            }

            case 3:

            {

                      sort(node, node + n, Cmp3);

                      break;

            }

            }

 

            cout << "Case " << count++ << ":" << endl;

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

            {

                cout << node[i].number << " " << node[i].name << " " << node[i].score << endl;

            }

        }

    }

    return 0;

}

View Cod

좋은 웹페이지 즐겨찾기