소 정렬은 ACM 문제를 풀 때 흔히 사용하는 연산입니다. 매번 버블링과 같은 O(n 2)의 순위를 직접 작성하면 프로그램이 쉽게 타임아웃될 뿐만 아니라 귀중한 게임 시간을 낭비하고 틀릴 가능성이 매우 높습니다.STL에는 n*log2(n)의 복잡도로 배열을 직접 정렬할 수 있는 정렬 함수가 있습니다. 이 함수를 사용하려면 헤더 파일을 포함해야 합니다.
이 함수는 두 개 또는 세 개의 인수를 전달할 수 있습니다. 첫 번째 인수는 정렬할 간격의 첫 번째 주소이고, 두 번째 인수는 간격의 마지막 주소 옆의 주소입니다. 즉, 정렬 간격은 [a, b]입니다. 간단히 말해, 배열 int a[100]이 있습니다. a[0]에서 a[99]까지 요소를 정렬하려면 sort(a, a+100)를 작성하면 됩니다. 기본 정렬은 오름차순입니다.
내 문제 "AC 전략"을 예로 들어 배열 T의 요소를 0에서 len-1까지 정렬하려면 sort(t, T+len);
벡터 v를 정렬하는 것도 비슷하게 sort(v.begin(), v . end());
정수보다 작은 타입으로 정의되어 있는 한, 정렬을 위한 데이터 타입은 정수로 제한되지 않습니다(예: 문자열 클래스와 같은 연산보다 작은 타입).
보다 작은 연산의 데이터 유형이 정의되지 않았거나 정렬 순서를 변경하려는 경우 세 번째 매개 변수인 비교 함수를 사용해야 합니다. 비교 함수는 '보다 작음' 관계가 무엇인지 지정하는 반환값이 bool인 사용자 정의 함수입니다. 정수 배열을 내림차순으로 정렬하려면 비교 함수인 cmp를 정의하여 시작할 수 있습니다.
Bool cmp(int a, int b)
{
return a & gtb;
}
정렬할 때 sort(a, a+100, CMP)를 작성합니다.
정의했다고 가정합니다. 구조체 노드를 정의했다고 가정합니다.
구조체 노드 {
int a;
int b;
double c;
}
노드 타입의 배열 노드 arr[100]이 있고, 이를 먼저 A 값에 따라 오름차순으로, 같은 A 값에 대해 B 값에 따라 내림차순으로, 같은 B 값에 대해 C에 따라 내림차순으로 정렬하고 싶다고 가정합니다. 다음과 같이 비교 함수를 작성할 수 있습니다.
코드 스니펫은 다음과 같습니다.
Bool cmp(노드 x, 노드 y)
{
If (x.a! = y.a) return x.a
If (x.b! = y . b)return x . b & gt; y.b
return return x.c & gty.c
}Sort by writing sort(arr, a+100, CMP);
qsort(s[0], n, sizeof(s[0]), CMP);
int cmp(constant void *a. 상수 void *b)
{
return *(int *)a-*(int *)b;
}
먼저, int 타입의 배열을 정렬합니다
int num[100];
Sample:
int cmp(constant void *a. 상수 void *b)
{
return *(int *)a-*(int *)b;
}
qsort(num, 100, sizeof(num[0]), CMP);
둘째, int 타입의 배열을 정렬(int 타입과 마찬가지로 )
char word[100];
샘플:
int cmp(상수 void *a, 상수 void *b)
{
return *(char *)a-*(int *)b;
}
qsort(word. 100, sizeof(word[0]), CMP);
셋째, double 타입의 배열을 정렬합니다(특히 주의)
double in[100];
int cmp(constant void *a, constant void *b)
{
return *(double *)a & gt; *(double *)b?1 : -1;
}
qsort(in, 100, sizeof(in[0]), CMP);
넷째, 첫 번째 레벨에서 구조를 정렬
구조 입력
{
더블 데이터 ;
int other
}s[100]
// 데이터의 값을 기준으로 가장 작은 것부터 가장 큰 것까지 구조를 정렬합니다. 구조체에는 다양한 유형의 정렬 키워드 데이터가 있습니다. 위의 예제를 참고하여 작성해 보세요.
int cmp(상수 void *a, 상수 void *b)
{
return((In *)a)-& gt; data-((In *)b)-& gt; data;
}
qsort(s, 100, sizeof(s[0]), CMP);
V. 구조
구조 입력
{
int x;
int y;
} s[100];
//Sort X는 가장 작은 것부터 가장 큰 것까지, Y는 X가 같으면 가장 큰 것부터 가장 작은 것까지 정렬합니다.
int cmp(상수 void *a, 상수 void *b)
{
*structure in c = (In *)a;
structure In * d = (In *)b;
if (c->; x!= d-& gt; x) return c-& gt; x-d-& gt; x;
p>또는 반환 d-& gt; y - c->y;
}
qsort(s, 100, sizeof(s[0]), CMP);
여섯째, 문자열 정렬
구조 입력
{
int data;
char str[ 100];
} s[100];
//구조체 내 사전 순서에 따라 문자열 str을 정렬합니다.
int cmp(상수 void *a, 상수 void *b)
{
return strcmp((In *)a)-& gt; str, ((In *)b)->str);
}
qsort(s, 100, sizeof(s[0]) , CMP);
7. 지오메트리에서 볼록 패킷을 찾기 위한 cmp 계산
1을 제외한 모든 점을 회전 각도별로 정렬하는 cmp 함수
Intcmp (constvoid * a, constvoid * b)//키 cmp.
{
constvoid * c = (point *) a;
constvoid * d = (point *) b;
If( calc(*c, *d, p[1]) & lt; 0) return 1;
else if(!calc(*c, *d, p[1]) & amp; & ampdis(c->; x, c-& gt; y, p[1]. x, p[1]. y) & lt; dis(d->; x, d-& gt; y, p [1]. x, p [1]. y))//직선상에 있으면 먼 것을 앞에 놓습니다.
리턴값 1;
else 반환값 -1;
}