將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。
nlogn
**演示
**演示(c++)
題目描述
給定你乙個長度為n的整數數列。
請你使用歸併排序對這個數列按照從小到大進行排序。
並將排好序的數列按順序輸出。
輸入格式
輸入共兩行,第一行包含整數 n。
第二行包含 n 個整數(所有整數均在1~109範圍內),表示整個數列。
輸出格式
輸出共一行,包含 n 個整數,表示排好序的數列。
資料範圍
1≤n≤100000
輸入樣例:
53 1 2 4 5
輸出樣例:
1 2 3 4 5
#include
using
namespace std;
const
int n=
1e5+10;
int array[n]
,temp[n]
;long
long f;
void
merge
(int
* a,
int l,
int r)
}int
main()
歸併排序的應用(求逆序對的數量)題目描述
給定乙個長度為n的整數數列,請你計算數列中的逆序對的數量。
逆序對的定義如下:對於數列的第 i 個和第 j 個元素,如果滿足 i < j 且 a[i] > a[j],則其為乙個逆序對;否則不是。
輸入格式
第一行包含整數n,表示數列的長度。
第二行包含 n 個整數,表示整個數列。
輸出格式
輸出乙個整數,表示逆序對的個數。
資料範圍
1≤n≤100000
輸入樣例:
62 3 4 5 6 1
輸出樣例:
5
#include
using
namespace std;
const
int n=
1e5+10;
int array[n]
,temp[n]
;long
long f;
void
merge
(int
* a,
int l,
int r)
while
(l1<=mid) temp[index++
]=a[l1++];
while
(r1<=r) temp[index++
]=a[r1++];
for(
int i=l,j=
0;i<=r;j++
,i++
) a[i]
=temp[j];}
intmain()
排序 歸併排序(Merge sort)
1945年,約翰 馮 諾依曼 john von neumann 發明了歸併排序,這是典型的分治演算法的應用。歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的...
歸併排序 Merge sort
merge the a s.m and a m 1.t to r s.t template void two merge typet a,typet r,int s,int m,int t while i m r k a i while j t r k a j merge the a 0.n 1 s...
歸併排序(merge sort)
歸併排序 歸併排序是一種遞迴排序演算法,無論陣列元素的原始順序如何,其效能恆定不變。將陣列一分為二,分別排序兩部分元素,再將有序的兩半陣列歸併為乙個有序陣列。歸併步驟比較陣列前一半的元素與陣列的後一半元素,並將較小元素移到臨時陣列,該過程繼續前進,直到其中一半再沒有元素為止。此後只需將其餘元素移到臨...