Computer >> 컴퓨터 >  >> 프로그램 작성 >> C 프로그래밍

병합 정렬을 사용하여 배열의 카운트 반전에 대한 C/C++ 프로그램?

<시간/>

주어진 배열을 정렬하기 위해 발생하는 반전 횟수를 반전 횟수라고 합니다. 반전 문제는 병합 정렬 알고리즘을 사용하여 해결할 수 있는 고전적인 문제입니다. 이 문제 v에서 우리는 왼쪽보다 더 많은 모든 요소를 ​​계산하고 그 수를 출력에 추가합니다. ThisLogic은 merge sort의 merge 함수 내에서 수행됩니다.

주제를 더 잘 이해하기 위해 예를 들어보겠습니다. 병합 프로세스와 관련된 두 개의 하위 어레이를 고려해 보겠습니다. -

병합 정렬을 사용하여 배열의 카운트 반전에 대한 C/C++ 프로그램?

병합 정렬을 사용하여 배열의 카운트 반전에 대한 C/C++ 프로그램?

병합 정렬을 사용하여 배열의 카운트 반전에 대한 C/C++ 프로그램?

병합 정렬을 사용하여 배열의 카운트 반전에 대한 C/C++ 프로그램?

병합 정렬을 사용하여 배열의 카운트 반전에 대한 C/C++ 프로그램?

병합 정렬을 사용하여 배열의 카운트 반전에 대한 C/C++ 프로그램?

Input: arr[] = { 1, 9, 6, 4, 5}
Output: Inversion count is 5

설명

배열의 반전 횟수

배열이 주어졌을 때 그 배열의 역수를 구하십시오. (i A[j])인 경우 쌍(i, j)은 배열 A의 반전이라고 합니다. arr

에서 이러한 모든 쌍을 계산해야 합니다.

예를 들어,

배열에 5개의 반전이 있습니다.

(9,6), (9,4), (9,5), (6,4), (6,5)

1. 요소의 값을 서로 비교합니다.

2. 낮은 인덱스의 값이 높으면 카운터를 증가시킵니다.

3. 결과를 표시합니다.

예시

#include <stdio.h>
int Merge(int arr[], int aux[], int low, int mid, int high) {
   int k = low, i = low, j = mid + 1;
   int inversionCount = 0;
   while (i <= mid && j <= high) {
      if (arr[i] <= arr[j]) {
         aux[k++] = arr[i++];
      } else {
         aux[k++] = arr[j++];
         inversionCount += (mid - i + 1); // NOTE
      }
   }
   while (i <= mid)
   aux[k++] = arr[i++];
   for (int i = low; i <= high; i++)
      arr[i] = aux[i];
   return inversionCount;
}
int MergeSort(int arr[], int aux[], int low, int high) {
   if (high == low) // if run size == 1
      return 0;
   int mid = (low + ((high - low) >> 1));
   int inversionCount = 0;
   inversionCount += MergeSort(arr, aux, low, mid);
   inversionCount += MergeSort(arr, aux, mid + 1, high);
   inversionCount += Merge(arr, aux, low, mid, high);
   return inversionCount;
}
int main() {
   int arr[] = { 1, 9, 6, 4, 5 };
   int N = 5;
   int aux[N];
   for (int i = 0; i < N; i++)
      aux[i] = arr[i];
   printf("Inversion count is %d", MergeSort(arr, aux, 0, N - 1));
   return 0;
}