修改之前写的合并排序法 而得来的算法,用来查找元素序列中的逆序对数量,最坏运行时间O( nlog2(n) ) 对于如本例中的完全逆序序列,计算出的逆序数的数量应为 ( n( n - 1 )) / 2个 #ifndef _INVERSECOUNTMERGE_H_ #define _INVERSECOUNTMERGE_H_ template< class T > int inversecountmerge( T* lpFinal, int iStart, int iMid, int iEnd ) { //统计逆序对数量 int count = 0; int n1 = iMid - iStart + 1; int n2 = iEnd - iMid; T * lpFore = new T[ n1 ]; T * lpRear = new T[ n2 ]; //拆分出的子数组 for( int index = 0; index < n1; ++index ) { lpFore[ index ] = lpFinal[ iStart + index ]; } for( int index = 0; index < n2; ++index ) { lpRear[ index ] = lpFinal[ iMid + index + 1 ]; } //数组末尾不使用哨兵元素 int k = iStart;//结果数组计数 int i = 0;//fore数组计数 int j = 0;//rear数组计数 for( ; k <= iEnd ; ++k ) { if( lpFore[ i ] <= lpRear[ j ] ) { lpFinal[ k ] = lpFore[ i ]; if( ++i == n1 ) { ++k; for( ;j < n2; ++j, ++k ) { lpFinal[ k ] = lpRear[ j ]; } break; } } else { //如果后部数组某元素小于前部数组某元素,由于前部和后部数组都按照从小到大顺序排列, //那么余下的前部数组的元素都大于这个后部数组的元素,所以 //前部数组的余下元素都与这个后部数组的元素形成逆序对。 count += n1 - i;// ( ( n1 - 1 ) - i ) + 1 = n1 - i lpFinal[ k ] = lpRear[ j ]; if( ++j == n2 ) { ++k; for( ;i < n1; ++i, ++k ) { lpFinal[ k ] = lpFore[ i ]; } break; } } } delete[] lpFore; delete[] lpRear; return count; } #endif #ifndef _INVERSECOUNTMEGERSORT_H_ #define _INVERSECOUNTMEGERSORT_H_ #include"inversecountmerge.h" template< class T > int inversecountmergesort( T* lpFinal, int iStart, int iEnd ) { int count = 0; if( iEnd > iStart ) { int iMid = ( iStart + iEnd ) / 2; count += inversecountmergesort( lpFinal, iStart, iMid ); count += inversecountmergesort( lpFinal, iMid + 1, iEnd ); count += inversecountmerge( lpFinal, iStart, iMid, iEnd ); } return count; } #endif #include<iostream> using namespace std; #include<conio.h> #include"inversecountmergesort.h" int main() { int a[ 8 ] ={ 7, 6, 5, 4, 3, 2, 1, 0 }; for( int i = 0; i < 8; ++i ) { cout<<a[ i ]<<" "; } cout<<endl; int count = inversecountmergesort( a, 0, 7 ); cout<<count<<endl; getch(); return 0; }