將陣列切成兩半,然後左邊排完 右邊排完 (二分遞迴) 合併排列(用臨時陣列:對左右兩邊的數誰大誰進去)
對於i,j (i < j ) 如果 a[i] < a[j] 則構成乙個逆序對
那思考:歸併排序 你知道左邊乙個單調遞增數列,右邊乙個單調遞增數列,mid是左右分界,屬於左邊,那對於右邊的數a[j]而言,在合併的時候,如果發現自己小於前面的乙個數a[i]進了陣列, 那說明a[i]~a[mid]都比a[j]大,構成了(mid-i+1) 個逆序對
這樣子,在合併的時候記錄逆序對,通過歸併排序就記錄了逆序對的個數
相鄰交換,你會發現如果交換一次 a[i],a[i+1],(a[i] > a[i+1])就等價於減少乙個逆序對,因為要最小次數,那你每次選相鄰兩個 a[i] > a[i+1] 即為最優,那麼這樣子做的結果就是把逆序對變為0,結果數即為逆序對的總個數
#include using namespace std;
const int ma = 5e5+10;
int a[ma],b[ma];
long long cnt;//小心溢位!!
void merge (int l,int r)
for (int k = l; k <= r; k++) a[k] = b[k];
return;
} int main()
return 0;
}
演算法高階指南 超快速排序 歸併排序求逆序對
在這個問題中,您必須分析特定的排序演算法 超快速排序。該演算法通過交換兩個相鄰的序列元素來處理n個不同整數的序列,直到序列按公升序排序。對於輸入序列9 1 0 5 4,超快速排序生成輸出0 1 4 5 9。您的任務是確定超快速排序需要執行多少交換操作才能對給定的輸入序列進行排序。輸入格式 輸入包括一...
逆序對 超快速排序
在這個問題中,您必須分析特定的排序演算法 超快速排序。該演算法通過交換兩個相鄰的序列元素來處理n個不同整數的序列,直到序列按公升序排序。對於輸入序列9 1 0 5 4,超快速排序生成輸出0 1 4 5 9。您的任務是確定超快速排序需要執行多少交換操作才能對給定的輸入序列進行排序。輸入格式 輸入包括一...
超快速排序 逆序對
在這個問題中,您必須分析特定的排序演算法 超快速排序。該演算法通過交換兩個相鄰的序列元素來處理n個不同整數的序列,直到序列按公升序排序。對於輸入序列9 1 0 5 4,超快速排序生成輸出0 1 4 5 9。您的任務是確定超快速排序需要執行多少交換操作才能對給定的輸入序列進行排序。輸入格式 輸入包括一...