问题描述: 设A[1..n]是一个包含n个不同数的数组,如果在i <j的情况下,有A[i] >A[j],则(I,j)称为A的一个逆序对 利用插入排序和归并排序实现的代码如下,其复杂度分别为各自排序算法复杂度 #include <iostream> using namespace std; typedef int ElementType; int InsertionSort_Inversion(ElementType elems[], int size); int MergeSort_Inversion(ElementType elems[], int begin, int end); int Merge_Inversion(ElementType elems[], int begin, int middle, int end); int main() { int size; //the size of the array cout << "Input the Size of the array:" << endl; cin >> size; int *a = new int[size] (); for (int i = 0; i < size; i++) { cin >> a[i]; } cout << "Before Sort: " << endl; for (int i = 0; i < size; i++) { cout << a[i] << endl; } cout << "Output the number of inversion of the array: " << endl; //cout <<InsertionSort_Inversion(a, size); cout <<MergeSort_Inversion(a, 0, size - 1); cout << "After Sort: " << endl; for (int i = 0; i < size; i++) { cout << a[i] << endl; } delete []a; } /************************************************* Function: InsertionSort_Inversion Description:对elems进行从小到大的排序来计算逆序对数量 Input: elems:ElementType类型的数组 size:elems的大小 Output: 逆序对的数量 *************************************************/ int InsertionSort_Inversion(ElementType elems[], int size) { int inversion = 0; for (int i = 1; i < size; i++) { int j = i - 1; //j表示正在和key比较大小的数组元素的序号 ElementType key = elems[i]; while ( key < elems[j] && j >= 0) { elems[j + 1] = elems[j]; j--; inversion++; } elems[j + 1] = key; } return inversion; } /************************************************* Function: MergeSort_Inversion Description:对elems进行从小到大的排序来计算逆序对数量 Input: elems:ElementType类型的数组 begin:elems的开始序号 end:elems的结束序号 Output: 逆序对的数量 *************************************************/ int MergeSort_Inversion(ElementType elems[], int begin, int end) { int inversion = 0; if (end == begin) { return 0; } else if (end == begin + 1) { if (elems[begin] > elems[end]) { ElementType tempElement = elems[begin]; elems[begin] = elems[end]; elems[end] = tempElement; inversion++; } } else { inversion += MergeSort_Inversion(elems, begin, (begin + end) / 2); inversion += MergeSort_Inversion(elems, (begin + end) / 2 + 1, end); inversion += Merge_Inversion(elems, begin, (begin + end) / 2, end); } return inversion; } /************************************************* Function: Merge_Inversion Description:对elems中begin到middle 和middle到end 两部分进行从小到大的合并,同时计算逆序对数量 Input: elems:ElementType类型的数组 begin:elems的开始序号 middle:elems的分割序号 end:elems的结束序号 Output: 逆序对的数量 *************************************************/ int Merge_Inversion(ElementType elems[], int begin, int middle, int end) { int inversion = 0; int *tempElems = new int[end - begin + 1] (); int pa = begin; //第一个子数组的开始序号 int pb = middle + 1; //第二个子数组的开始序号 int ptemp = 0; //临时数组的开始序号 while (pa <= middle && pb <= end) { if (elems[pa] > elems[pb]) { tempElems[ptemp++] = elems[pb++]; inversion += (middle + 1 - pa); } else { tempElems[ptemp++] = elems[pa++]; } } if (pa > middle) { for ( ; pb <= end; pb++) { tempElems[ptemp++] = elems[pb]; } } else if(pb > end) { for ( ; pa <= middle; pa++) { tempElems[ptemp++] = elems[pa]; } } //copy tempElems to lems for (int i = 0; i < end - begin + 1; i++) { elems[begin + i] = tempElems[i]; } delete []tempElems; return inversion; }