數算MOOC 求逆序對(歸併排序)

2021-07-26 17:11:09 字數 1231 閱讀 9335

首先介紹歸併排序,它是指對乙個陣列,劃分為兩個。對兩個陣列分別排序,兩個陣列排序好後合併。

合併的過程為:從兩個陣列取第乙個數,下標i,j,比較,數值比較小的複製到乙個輔助陣列中,然後下標++即可。如果有乙個陣列提前結束,把另外乙個陣列複製到輔助陣列中。然後把輔助陣列複製給原陣列即完成排序。通過遞迴,很容易實現。

利用歸併排序求逆序對該怎麼求呢?

已經排序好的陣列逆序對為0(廢話)

兩個陣列歸併,如果左陣列中的元素a[i]大於右陣列a[j],歸併陣列則的逆序對+mid-i+1即可(a[i]右面的左陣列元素都大於a[j])

這樣累加即可

題目描述

總時間限制: 

500ms 

記憶體限制: 

65536kb

描述 對於乙個長度為n的整數序列a,滿足i < j 且 ai > aj.的數對(i,j)稱為整數序列a的乙個逆序

請求出整數序列a的所有逆序對個數

輸入輸入包含多組測試資料,每組測試資料有兩行

第一行為整數n(1 <= n <= 20000),當輸入0時結束

第二行為n個整數,表示長為n的整數序列

輸出每組資料對應一行,輸出逆序對的個數

樣例輸入

5

1 2 3 4 5

55 4 3 2 111

0

樣例輸出

0

100

上**

#includeusing namespace std;

const int maxn=20005;

int n;

int num[maxn];

int temp[maxn];

int count;

void scanf()

void input()

void merge(int left, int mid, int right)

}while(index1<=mid)

num[i++]=temp[index1++];

while(index2<=right)

num[i++]=temp[index2++];

}void merge_sort(int left, int right)

}void init()

void print()

int main()

}

歸併排序求逆序對

排序都用qsort了,別的排序演算法不怎麼用,但有些排序的思想很重要。碰到一道求逆序對的題,要用到歸併排序,學習了一下歸併排序。歸併排序是用分治思想,分治模式在每一層遞迴上有三個步驟 分解 將n個元素分成個含n 2個元素的子串行。解決 用合併排序法對兩個子串行遞迴的排序。合併 合併兩個已排序的子串行...

歸併排序求逆序對

我們知道,求逆序對最典型的方法就是樹狀陣列,但是還有一種方法就是merge sort 即歸併排序。實際上歸併排序的交換次數就是這個陣列的逆序對個數,為什麼呢?我們可以這樣考慮 歸併排序是將數列a l,h 分成兩半a l,mid 和a mid 1,h 分別進行歸併排序,然後再將這兩半合併起來。在合併的...

歸併排序求逆序對

現在給定乙個有n個數的數列ai。若對於i j,有ai aj,則稱 i,j 為數列的乙個逆序對。例如,2,3,8,6,1 有五個逆序對,分別是 1,5 2,5 3,4 3,5 4,5 現在請你求出乙個給定數列的逆序對個數。輸入格式 乙個整數t,表示有多少組測試資料。每組測試資料第一行是乙個正整數n 1...