歸併排序C 實現及求逆序對的個數

2022-06-26 06:48:13 字數 2298 閱讀 5880

1.歸併排序的遞迴實現:

#include#include

#include

#include

#include

#include

using

namespace

std;

void mergesort(vector& nums, vector ©, int start, int

end)

int len = (end - start) / 2

; mergesort(nums, copy, start, start +len);

mergesort(nums, copy, start + len + 1

, end);

int i = start, j = start + len + 1, index =start;

while (i <= start + len && j <=end)

else

index++;

}while (i <= start + len)//

如果前半段有剩餘則複製到copy陣列中

while (j <= end)//

如果後半段有剩餘則複製到copy陣列中

for (int i = start;i <= end;i++)//

此時copy陣列已經有序,將其複製到原陣列中

nums[i] =copy[i];

}int

main()

; vector

nums(a, a + 8

);

int len =nums.size();

vector

copy(len);

mergesort(nums, copy,

0, len - 1

);

for(auto e : nums)

cout

<< e << "";

cout

cout

<< e << "";

cout

}

2. 求逆序對的個數

只需將歸併排序的演算法稍微修改一下即可

#include#include

#include

#include

#include

#include

using

namespace

std;

int mergesort(vector& nums, vector ©, int start, int

end)

int len = (end - start) / 2

;

int left = mergesort(nums, copy, start, start +len);

int right = mergesort(nums, copy, start + len + 1

, end);

int i = start, j = start + len + 1, index =start;

int cnt = 0

;

while (i <= start + len && j <=end)

else

index++;

}while (i <= start + len)//

如果前半段有剩餘則複製到copy陣列中

while (j <= end)//

如果後半段有剩餘則複製到copy陣列中

for (int i = start;i <= end;i++)//

此時copy陣列已經有序,將其複製到原陣列中

nums[i] =copy[i];

return left + right +cnt;

}int

main()

; vector

nums(a, a + 4

);

int len =nums.size();

vector

copy(len);

cout

<< "

kkk

"<0, len - 1)

cout

<< e << "";

cout

cout

<< e << "";

cout

}

逆序對個數(歸併排序)

description 給出乙個陣列a,問這個陣列中有多少個逆序對。逆序對定義 若ia j 則 a i a j 是乙個逆序對。如陣列3 4 1 2中的逆序對有 3,1 3,2 4,1 4,2 共4個逆序對。input 第一行乙個整數n,表示元素個數。第二行n個空格分隔的整數a i output 乙個...

歸併排序求逆序對

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

歸併排序求逆序對

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