#include<iostream> using namespace std; static int count = 0; void merge(int *q,int m,int l,int r) { int *larray = new int [m-l+1]; int *rarray = new int [r-m+1-1]; for(int z = 0;z != m-l+1;++z) larray[z] = q[l+z];//注意q的下標 for(int z = 0;z != r-m;++z) rarray[z] = q[(m+1)+z];//下標 int i = 0,j = 0; for(int k = l;k != r+1;++k)//注意k不從0開始 { if(i != m-l+1 && j == r-m) { q[k] = larray[i++]; } else if(i == m-l+1 && j != r-m) { q[k] = rarray[j++]; } else if(larray[i] > rarray[j]) { q[k] = rarray[j++]; count += (m-l+1)-i;//計數逆序數對,左邊的大那麼左邊剩下的都比右邊的大 } else { q[k] = larray[i++]; } } } void merge_sort(int *p,int left,int right) { if(left < right)//if和while,我當初怎麼就用了while呢???? { int mid = (left+right)/2; merge_sort(p,left,mid); merge_sort(p,(mid+1),right); merge(p,mid,left,right); } } int main() { int a[] = {6,5,4,3,2,1}; int n = (sizeof(a)/sizeof(int))-1; merge_sort(a,0,n); cout << count << endl; return 0; }