1. 程式人生 > >歸並排序(逆序對數)

歸並排序(逆序對數)

poj 中間 分享圖片 clas 求逆序對 display closed 歸並排序 對數

技術分享圖片
ll qans;           // 記錄答案 
int date[maxn];    // 數據數組 
int tarray[maxn];  // 歸並排序的中間數組 

// POJ - 2299     SGU - 180
void merge(int arr[], int left, int right, int tarr[]) 
{
    if (left>=right) return ;
    int m = (left+right) >> 1;
    merge(arr, left, m, tarr);
    merge(arr, m+1, right, tarr);
    
int i,j, cnt; i = left; j = m+1; cnt = 0; while (i<=m && j<=right) { if (arr[i] <= arr[j]) tarr[cnt++] = arr[i++]; else { qans += (ll)m - i + 1; // 求逆序對. tarr[cnt++] = arr[j++]; } } while (i<=m) tarr[cnt++] = arr[i++];
while (j<=right) tarr[cnt++] = arr[j++]; for (i=0; i<cnt; ++i) arr[left++] = tarr[i]; }
View Code

歸並排序(逆序對數)