演算法複習 歸併排序求解逆序數問題 分治

2021-10-12 12:24:42 字數 1239 閱讀 1711

題目描述:

解析:本題使用歸併排序來求解逆序對數的問題,交換元素的次數正好就等於逆序數的個數。

**:

#include

#include

#include

#include

using std::cin;

using std::cout;

using std::endl;

using std::vector;

using std::string;

void

merge

(vector<

int>

&a,int low,

int high,

int mid,

int& count)

else

temp.

push_back

(a[i++])

;}while

(i <= mid)temp.

push_back

(a[i++])

;while

(j <= high)temp.

push_back

(a[j++])

;for

(auto i =

0; i < temp.

size()

; i++

)a[low + i]

= temp[i];}

void

mergesort

(vector<

int>

&a,int low,

int high,

int&count)

}int

main()

;int count =0;

int low =

0, high = a.

size()

-1;mergesort

(a, low, high, count)

;for

(auto i =

0; i < a.

size()

; i++

)cout << a[i]

<<

" "

; cout << endl;

cout << count << endl;

return0;

}

分治法求解逆序數 歸併排序

題目內容 設a1,a2,an是集合的乙個排列,如果iaj,則序偶 ai,aj 稱為該排列的乙個逆序。例如,2,3,1有兩個逆序 3,1 和 2,1 設計演算法統計給定排列中含有逆序的個數。輸入格式 第一行輸入集合中元素個數n,第二行輸入n個集合元素 輸出格式 含有逆序的個數 輸入樣例 32 3 1 ...

歸併排序 逆序數

對於數列a,將其二分地拆分為b,c 先將b,c分別排序好,再合併b,c即為總的排序,不過在合併的過程中我們可以算出逆序數哦。其原理網上很多,我這裡不再贅述,只給出實現 include include define ll long long using namespace std ll mergeso...

逆序數(歸併排序)

分而治之 分 每次從中間劃分開,直到有序為止,即乙個整數 void merge int s,int left,int right 治重新定義乙個a陣列,儲存排序完的合併陣列,void sort int s,int left,int mid,int right while i mid a k s i ...