一、归并排序
#include <iostream>
using namespace std;
int a[ 100 ] , b[ 100 ] ;
void merge ( int a[ ] , int l, int m, int e, int b[ ] ) {
int p1 = l, p2 = m + 1 , p = 0 ;
while ( p1 <= m && p2 <= e) {
if ( a[ p1] < a[ p2] )
b[ p++ ] = a[ p1++ ] ;
else
b[ p++ ] = a[ p2++ ] ;
}
while ( p1 <= m) {
b[ p++ ] = a[ p1++ ] ;
}
while ( p2 <= e) {
b[ p++ ] = a[ p2++ ] ;
}
for ( int i = 0 ; i < e - l + 1 ; i++ )
a[ l + i] = b[ i] ;
}
void mergesort ( int a[ ] , int l, int r, int b[ ] ) {
if ( l < r) {
int mid = l + ( r - l) / 2 ;
mergesort ( a, l, mid, b) ;
mergesort ( a, mid + 1 , r, b) ;
merge ( a, l, mid, r, b) ;
}
}
int main ( ) {
int n;
cin >> n;
for ( int i = 0 ; i < n; i++ )
cin >> a[ i] ;
mergesort ( a, 0 , n - 1 , b) ;
for ( int i = 0 ; i < n; i++ )
cout << a[ i] << " " ;
cout << endl;
return 0 ;
}
二、利用归并排序的变形求逆序数
#include <iostream>
using namespace std;
int a[ 100 ] , b[ 100 ] ;
void merge ( int a[ ] , int l, int m, int e, int b[ ] , int & count) {
int p1 = l, p2 = m + 1 , p = 0 ;
while ( p1 <= m && p2 <= e) {
if ( a[ p1] > a[ p2] ) {
count + = e - p2 + 1 ;
b[ p++ ] = a[ p1++ ] ;
}
else {
b[ p++ ] = a[ p2++ ] ;
}
}
while ( p1 <= m) {
b[ p++ ] = a[ p1++ ] ;
}
while ( p2 <= e) {
b[ p++ ] = a[ p2++ ] ;
}
for ( int i = l; i <= e; i++ )
a[ i] = b[ i - l] ;
}
void mergesort_count ( int a[ ] , int l, int r, int b[ ] , int & count) {
if ( l < r) {
int mid = l + ( r - l) / 2 ;
mergesort_count ( a, l, mid, b, count) ;
mergesort_count ( a, mid + 1 , r, b, count) ;
merge ( a, l, mid, r, b, count) ;
}
}
int main ( ) {
int n;
cin >> n;
for ( int i = 0 ; i < n; i++ )
cin >> a[ i] ;
int count = 0 ;
mergesort_count ( a, 0 , n - 1 , b, count) ;
cout << "逆序数的对数:" << count << endl;
for ( int i = 0 ; i < n; i++ )
cout << a[ i] << " " ;
cout << endl;
return 0 ;
}