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 分別進行歸併排序,然後再將這兩半合併起來。在合併的...