逆序数: 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。 #include "stdafx.h" #include <cassert> #include <iostream> using namespace std; class ReversedOrder { public: ReversedOrder(int *data, int length):elemArray(data),arrayLength(length),reverseCount(0) {} ~ReversedOrder() { if (elemArray) { delete []elemArray; elemArray = NULL; } } void orderAll() { order(0, arrayLength - 1); } int getReversedCount() { return reverseCount; } private: void order(int left, int right) { if (left >= right) return ; int mid = (left + right) / 2; order(left, mid); order(mid + 1, right); merge(left, mid, mid + 1, right); } void merge(const int start1, const int end1, const int start2, const int end2) { int *tempArray = new int[end2 - start1 + 1]; assert(tempArray); int tempArrayLength = end2 - start1 + 1; int tempArrayIndex = 0; int tempStart1 = start1; int tempStart2 = start2; while ((tempStart1 <= end1) && (tempStart2 <= end2)) { if (elemArray[tempStart1] < elemArray[tempStart2]) { tempArray[tempArrayIndex++] = elemArray[tempStart1++]; } else { reverseCount += (end1 - tempStart1 + 1); tempArray[tempArrayIndex++] = elemArray[tempStart2++]; } } while (tempStart1 <= end1) { tempArray[tempArrayIndex++] = elemArray[tempStart1++]; } while (tempStart2 <= end2) { tempArray[tempArrayIndex++] = elemArray[tempStart2++]; } for (tempArrayIndex = 0, tempStart1 = start1; tempArrayIndex < tempArrayLength; tempStart1++,tempArrayIndex++) { elemArray[tempStart1] = tempArray[tempArrayIndex]; } delete []tempArray; } int reverseCount; int *elemArray; int arrayLength; }; int _tmain(int argc, _TCHAR* argv[]) { int *data = NULL; int length = 0; cin >> length; data = new int[length]; for(int i = 0; i < length; i++) { cin >> data[i]; } ReversedOrder reverse(data, length); reverse.orderAll(); cout << reverse.getReversedCount() << endl; return 0; } 在merge函数中,进行了多次的数组的拷贝,会影响效率。