정렬 및 예제 병합

3671 단어
병합 정렬 (MERGE - SORT) 은 병합 작업 에 있어 효과 적 인 정렬 알고리즘 으로 이 알고리즘 은 분 치 법 (Divide and Conquer) 을 사용 하 는 매우 전형 적 인 응용 이다.
기 존 서열 의 하위 서열 을 합쳐서 완전히 질서 있 는 서열 을 얻는다.즉, 모든 하위 서열 을 질서 있 게 한 다음 에 하위 서열 을 질서 있 게 하 는 것 이다.
두 개의 질서 표를 하나의 질서 표 로 합치 면 2 번 병합 이 라 고 합 니 다.병합 정렬 은 안정 적 인 정렬 방법 이다.
 
용도:
정렬 속도:
(속 도 는 빠 른 정렬 에 이 어 안정 적 인 정렬 알고리즘 으로 전체 무질서 에 사용 되 지만 각 하위 항목 이 상대 적 으로 질서 있 는 수열)
 
역순 대수 구하 기:
구체 적 인 사 고 는 병합 과정 에서 각 동네 간 의 역순 대 수 를 계산 하여 큰 구간 의 역순 대 수 를 계산 하 는 것 이다 (나무 모양 배열 로 도 풀 수 있다).
#include
const int MAXN=200005;
int n, a[MAXN], temp[MAXN];
long long ans;
void count(int l, int r)
{    
    if(r == l) return ;//    
    int m = (l + r) >> 1;//(l+r)       1 ,   (l+r)/2
count(l, m); count(m
+ 1, r);// int i = l, j = m + 1, k = l; while(j <= r || i <= m) { if(j > r || (i <= m && a[i] < a[j])) temp[k++] = a[i++]; else temp[k++] = a[j++], ans += m - i + 1; } for(i = l; i <= r; i++)
     a[i] = temp[i];} int main() { scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); count(1, n);// printf("%lld", ans);// return 0; }

예제: HDU 4911 Inversion 역순 수 쌍
https://blog.csdn.net/crescent__moon/article/details/38424829

좋은 웹페이지 즐겨찾기