Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cmath>
- #include <cstdio>
- #include <vector>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- long _mergeSort(int arr[], int temp[], int left, int right);
- long merge(int arr[], int temp[], int left, int mid, int right);
- long mergeSort(int arr[], long size)
- {
- int * array= new int [size];
- return _mergeSort(arr, array, 0, size - 1);
- delete[] array;
- }
- long _mergeSort(int arr[], int temp[], int start, int end)
- {
- long numberOfInversions = 0;
- if (start < end) {
- int mid = (end + start) / 2;
- numberOfInversions = _mergeSort(arr, temp, start, mid);
- numberOfInversions += _mergeSort(arr, temp, mid + 1, end);
- numberOfInversions += merge(arr, temp, start, mid + 1, end);
- }
- return numberOfInversions;
- }
- long merge(int arr[], int temp[], int start, int mid, int end)
- {
- long numberOfInversions = 0;
- int left = start;
- int right = mid;
- int beginOfArray = start;
- while ((left <= mid - 1) && (right <= end)) {
- if (arr[left] <= arr[right]) {
- temp[beginOfArray++] = arr[left++];
- }
- else {
- temp[beginOfArray++] = arr[right++];
- numberOfInversions = numberOfInversions + (mid - left);
- }
- }
- while (left <= mid - 1)
- temp[beginOfArray++] = arr[left++];
- while (right <= end)
- temp[beginOfArray++] = arr[right++];
- for (left = start; left <= end; left++)
- arr[left] = temp[left];
- return numberOfInversions;
- }
- int main()
- {
- long numberOfBuildings = 0;
- cin >> numberOfBuildings;
- long y = 0;
- int * buildingsHeight = new int[numberOfBuildings];
- for (int i = 0; i < numberOfBuildings; i++) {
- cin >> buildingsHeight[i];
- }
- y= mergeSort(buildingsHeight, numberOfBuildings);
- cout<<y;
- delete[] buildingsHeight;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement