面试题36:数组中的逆序对
题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
分析:可以利用二路归并排序算法对数组进行排序,并在排序过程中统计逆序对的数目。
template <typename Comparable> void inversePairs ( vector<Comparable> & a, int & count ) {//驱动程序 inversePairs ( a, 0, a.size()-1, count ); } template <typename Comparable> void inversePairs ( vector<Comparable> & a, int left, int right, int&count) {//对left到right范围内的数据排序 if ( left < right ) { int mid = ( left + right ) /2; inversePairs ( a, left, mid, count ); inversePairs ( a, mid + 1, right,count ); inversePairsCore ( a, left, mid + 1, right,count ); } } template <typename Comparable> void inversePairsCore ( vector<Comparable> & a, int leftStart, int rightStart, int rightEnd, int&count ) {//对leftStart到rightStart-1,以及rightStart到rightEnd这两组数据进行排序 int leftEnd = rightStart - 1; int numElements = rightEnd - leftStart + 1; vector<Comparable>temp(numElements); int indexTemp = numElements-1; while ( leftEnd >= leftStart && rightEnd >= rightStart ) { if ( a[leftEnd] > a[rightEnd] ) { count += rightEnd-rightStart+1;//统计逆序对 temp[indexTemp--] = a[leftEnd--]; } else { temp[indexTemp--] = a[rightEnd--]; } } while ( leftStart <= leftEnd ) { temp[indexTemp--] = a[leftEnd--]; } while ( rightStart <= rightEnd ) temp[indexTemp--] = a[rightEnd--]; for ( int i = 0; i < numElements; ++i ) a[leftStart + i] = temp[i]; }