陣列中的逆序對(歸併排序)

2021-09-30 01:48:21 字數 1463 閱讀 6088

題目:陣列中的逆序對

思路:典型的歸併排序(很好的題目)

這是乙個歸併排序的合併過程,主要考慮合併兩個有序序列時,計算逆序對的個數

對於兩個公升序序列,設定兩個下標(前下標和後下標),初始化為前序列第乙個數字的下標和後序列第乙個數字的下標。如果前下標對應的值大於後下標對應的值,則有「前序列剩下的長度」個逆序對(即mid - first_start + 1個),否則這不構成逆序對。然後把較大值拷貝到輔助陣列中,即最終把兩個有序序列合併到輔助陣列,並保證在輔助陣列中也是公升序的。

#include

#include

using

namespace std;

//思路是歸併排序的思想。計算左、右部分的逆序對的時候,利用遞迴。(個人感覺類似dfs,從最底層子遞迴入手)

class

solution

private

:int

merge_count

(vector<

int>

&data,

int start,

int mid,

int end)

//此時左、右部分都是公升序序列

}//若second_start先到了後半段末尾

while

(first_start <= mid)

temp[copy_start++

]= data[first_start++];

//若first_start先到了前半段末尾

while

(second_start <= end)

temp[copy_start++

]= data[second_start++];

for(

int i = start; i <= end; i++

) data[i]

= temp[i]

;return count;

}int

merge

(vector<

int>

&data,

int start,

int end)

//左、右部分分別遞迴};

intmain

(void);

solution solution;

int result = solution.

inversepairs

(a);

cout << result << endl;

system

("pause");

return0;

}

陣列中的逆序對(歸併排序)

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。在歸併排序的一次merge中,r j 1 法一 統計i的逆序數 int merge int a,int p,int q,int r int n1 q p 1,n2 r q in...

陣列中的逆序對(歸併排序)

題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 1...

陣列中逆序對(歸併排序思想)

題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 1...