逆序对(归并)
使用归并的逻辑,在两个子数组拍完序之后,归并之前,后一个数组中的每一个数字a,前一个数组中与a配对的逆序对的数量可以用归并排序的方式求得。
#include <vector> #include <iostream> using namespace std; int Merge(vector<int>& arr, int b, int e) { if (b >= e) return 0; int reverse_pair_num = 0; int mid = (b + e) / 2; vector<int> tmp; tmp.resize(e - b + 1); int i = b; int j = mid + 1; int pos = 0; while (i <= mid && j <= e) { if (arr[i] > arr[j]) { tmp[pos++] = arr[i++]; } else { tmp[pos++] = arr[j++]; reverse_pair_num += i - b; } } while (i <= mid) { tmp[pos++] = arr[i++]; } while (j <= e) { tmp[pos++] = arr[j++]; reverse_pair_num += i - b; } pos = 0; for (; b <= e; ++b) { arr[b] = tmp[pos++]; } return reverse_pair_num; } int MergeSort(vector<int>& arr, int b, int e) { if (b >= e) return 0; int reverse_pair_num = 0; int mid = (b + e) / 2; reverse_pair_num += MergeSort(arr, b, mid); reverse_pair_num += MergeSort(arr, mid + 1, e); reverse_pair_num += Merge(arr, b, e); return reverse_pair_num; } int main() { int a[] = {3,3,2,1,11,13,2,1,7,8}; vector<int> arr; arr.assign(a, a + sizeof(a) / sizeof(int)); cout << MergeSort(arr, 0, arr.size() - 1) << endl; for (int i = 0; i < arr.size(); ++i) { cout << arr[i] << "\t"; } cout << endl; return 1; }
Passion, patience, perseverance, keep it and move on.