排序 歸併排序 merge sort

2021-10-08 18:11:46 字數 1670 閱讀 9703

將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。

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)

歸併排序 歸併排序是一種遞迴排序演算法,無論陣列元素的原始順序如何,其效能恆定不變。將陣列一分為二,分別排序兩部分元素,再將有序的兩半陣列歸併為乙個有序陣列。歸併步驟比較陣列前一半的元素與陣列的後一半元素,並將較小元素移到臨時陣列,該過程繼續前進,直到其中一半再沒有元素為止。此後只需將其餘元素移到臨...