求陣列中的逆序對數目(POJ1007)

2021-06-20 02:31:17 字數 698 閱讀 6764

這個題真心寫醜了,不過當做練習還是很不錯的。

思想就是利用歸併排序的辦法,先計算左右兩個子陣列的逆序對數目,把他們加起來。然後用兩個指標指向子陣列的頭,如果前面的子陣列目前元素較大,就把後面子陣列的頭部元素插入結果陣列;否則,前面的元素應該進入結果陣列了,此時,結果陣列裡的後面子陣列元素個數即為此元素造成的逆序對的個數。

#include #include #include #include using namespace std;

struct data

};int calrev(char *s, int start, int end)

else

} while (i <= mid)

while (j <= end)

for (int i = 0; i < end - start + 1; ++i)

s[start + i] = tmp[i];

delete tmp;

return res;

}void cal(data &mydata)

int main()

stable_sort(data, data + m);

for (int i = 0; i < m; ++i)

cout << data[i].dna << endl;

return 0;

}

劍指offer 陣列中的逆序對數目

問題 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 對於逆序對的問題,首先最容易想到的就是暴力窮舉的方法。然而在題目中n的取值非常大,遍歷的時間...

求陣列中逆序的個數

考慮一下,逆序是說a i a j i乙個比較好的思路是利用分治的思想 先求前面一半陣列的逆序數,再求後面一半陣列的逆序數,然後求前面一半陣列比後面一半陣列中大的數的個數 也就是逆序數 這三個過程加起來就是整體的逆序數目了。看這個描述,是不是有點像歸併排序呢?利用歸併排序的過程中,在每一次歸併兩個陣列...

求陣列中逆序的個數

考慮一下,逆序是說a i a j i乙個比較好的思路是利用分治的思想 先求前面一半陣列的逆序數,再求後面一半陣列的逆序數,然後求前面一半陣列比後面一半陣列中大的數的個數 也就是逆序數 這三個過程加起來就是整體的逆序數目了。看這個描述,是不是有點像歸併排序呢?利用歸併排序的過程中,在每一次歸併兩個陣列...