1.在陣列中的兩個數字如果前面的乙個數字大於後面的數字,則這兩個數字組成乙個逆序對,輸入乙個陣列,求這個陣列中的逆序對的總數。
分析:例如在陣列中,一共存在5個逆序對,,,,,。常規的做法是每次確定乙個數字在陣列中後面有多少個數比他小,這樣的時間複雜度是o(n*n)。比較大,可以先將大的陣列分為小的陣列,再統計逆序對,看能不能較少比較的次數。
例如:第一步,將陣列進行二分,分為單個元素時,先兩兩進行合併排序,此時的逆序數只能是1或者是0,因為只有兩個數,如果是公升序,則是0,如果是降序則是1;這樣兩個組得到的逆序數的和是2.
第二步,對兩個分別包含2個元素的陣列進行排序並統計逆序數。兩個指標分別指向陣列的末尾,因為兩個子陣列已經是已排序的陣列,這樣的話如果第乙個陣列的末尾的元素大於第二個陣列的末尾元素的話,則他肯定比第二個陣列中的所有的元素都大,例如7>6,則7肯定是最大的數,放在末尾,逆序數是第二陣列的長度;比較5的時候,5<6,此時帶比較的數中最大的數就是6了,不存在逆序數。拷貝到輔助陣列中,繼續比較剩餘的數。最後得到逆序數是5.整個過程就是歸併排序的過程。
原始碼:
/**
* 功能說明:陣列中逆序數的統計
* 日期:2016-9-7
**/#includeusing namespace std;
int inversepairs(int* data, int length);
int inversepairscore(int* data, int* copy, int start, int end);
int main()
; int length = sizeof(data) / sizeof(int);
int count = inversepairs(data, length);
cout << "the count is: " << count<= start && j >= start + length + 1)
else
}for (; i >= start; --i)//將前面部分剩餘的元素考到輔助陣列中
copy[indexcopy--] = data[i];
for (; j >= start + length + 1; --j)
copy[indexcopy--] = data[j];
return left + right + count;
}
面試題36 陣列中的逆序對
題目 在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。例如,有乙個陣列為array 0.n 其中有元素a i a j 如果 當ia j 那麼我們就稱 a i a j 為乙個逆序對。在陣列中一共存在5對逆序對,分別是 7,6 7...
面試題36 陣列中的逆序對
面試題36 陣列中的逆序對 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的...
面試題36 陣列中的逆序對
題目 在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。分析 可以利用二路歸併排序演算法對陣列進行排序,並在排序過程中統計逆序對的數目。template void inversepairs vector a,int count ...