這個題真心寫醜了,不過當做練習還是很不錯的。
思想就是利用歸併排序的辦法,先計算左右兩個子陣列的逆序對數目,把他們加起來。然後用兩個指標指向子陣列的頭,如果前面的子陣列目前元素較大,就把後面子陣列的頭部元素插入結果陣列;否則,前面的元素應該進入結果陣列了,此時,結果陣列裡的後面子陣列元素個數即為此元素造成的逆序對的個數。
#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乙個比較好的思路是利用分治的思想 先求前面一半陣列的逆序數,再求後面一半陣列的逆序數,然後求前面一半陣列比後面一半陣列中大的數的個數 也就是逆序數 這三個過程加起來就是整體的逆序數目了。看這個描述,是不是有點像歸併排序呢?利用歸併排序的過程中,在每一次歸併兩個陣列...