我昨天的中缀表达式转换后缀表达式记录没了????

 

 

#include <iostream>
#include <vector>
using namespace std;
void merge( vector<int>& , int, int );
int ans = 0;

void mergeSort( vector<int>& arr, int begin, int end ) {
    if ( begin >= end )
        return;

    mergeSort( arr, begin, (begin + end)/2 );
    mergeSort( arr, ( begin + end )/2 + 1, end );
    merge( arr, begin, end );
}

void merge( vector<int>& arr, int begin, int end ) {
    vector<int> a(end-begin+1);
    int i = begin;
    int mid = ( begin + end )/2 + 1;
    int j = ( begin + end )/2 + 1;
    int k = 0;
    while ( i < mid && j <= end ) {     //一开始写的是 i<j想当然的写了,debug好久才查出来,j是变动的,不能做参考标
        if ( arr[i] <= arr[j] )
            a[k++] = arr[i++];
        else {
            a[k++] = arr[j++];
            ans += mid - i;            //添加的变量就是找逆序对,其实就是合并两个子数组的中后面的数组当前值小于前面数组当前值,那么就加上前面
                                       //数组当前下标后面(包括当前)的所有元素。 clion 调试出现 lldb中可以使用"p 变量名"打印元素
        }
        if ( i >= mid || j > end )
            break;
    }

    if ( i == ( begin + end) / 2 + 1 ) {
        while ( j <= end )
            a[k++] = arr[j++];
    }
    else if ( j == end + 1 ) {
        while (i < (begin + end) / 2 + 1)
            a[k++] = arr[i++];
    }

    for ( i = begin; i <= end; i++ )
        arr[i] = a[i - begin];        //一开始写的a[i] 然而实际上是错的,因为arr的下标会跟a的下标不同

}

int main() {
    int a[8] = { 8, 4 ,7,0,3,5,9,1 };
    vector<int> b(a, a+8);
    mergeSort(b, 0, 7);
    for ( int i = 0; i < 8; i++ )
        cout << b[i] << " " ;
    cout << ans << endl;
}