我所知道的排序演算法之歸併排序

2021-10-25 21:34:39 字數 3691 閱讀 1382

基本介紹

歸併排序(merge- sort)是利用歸併的思想實現的排序方法,該演算法採用經典的分治( divide- and-conquer)策略(分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案修補」在一起,即分而治之)。

基本思想

1.把陣列從中間劃分成兩個子陣列;

2.一直遞迴地把子陣列劃分更小的子陣列直到子陣列裡面只有乙個元素

3.依次按照遞迴的返回順序,不斷地合併排好序的子陣列,直到最後把整個陣列的順序排好

看看治階段,我們需要將兩個已經有序的子串行合併成乙個有序序列,比如上圖中的最後一次合併,要將[4,5,7,8]和[1,2,3,6]兩個已經有序的子串行,合併為最終序列[1,2,3,4,5,6,7,8],來看下實現步驟

按圖所示實現分解方法

//int arr=;

//int temp=new int[arr.length];

//分解方法

public static void mergesort(int arr, int left, int right, int temp)

mergesort(arr, left, mid, temp);

//向右遞迴進行分解

//mid+1 - midright 即是4 - 7

mergesort(arr, mid + 1, right, temp);}}

按圖所示實現合併方法

//合併的方法

/** *

* @param arr 排序的原始陣列

* @param left 左邊有序序列的初始索引

* @param mid 中間索引

* @param right 右邊索引

* @param temp 做中轉的陣列

**/public static void merge(int arr, int left, int mid, int right, int temp) mid=(left+right)/2 = 2

//此時左邊i=left mid左邊的就是 0 - mid 即是

//此時右邊就是mid+1 - right 即是

int j = mid+1;

int t = 0;//指向temp陣列的當前索引

//(-)

//先把左右兩邊(有序)的資料按照規則填充到temp陣列

//直到左右兩邊的有序序列,有一邊處理完畢為止

//i <= mid 代表左邊有序序列有值

//j <= right 代表右邊有序序列有值

while (i <= mid & j <= right)

//左邊 0 - mid 即是

//右邊 mid+1 -right 即是

//若arr[i]<= arr[j] 即是1 <= 6

if (arr[i] <= arr[j]) else

}//(二)

//把有剩餘資料的一邊的資料依次全部填充到temp

//左邊的有序序列還有剩餘的元素,就全部填充到temp

while( i <= mid)

//右邊的有序序列還有剩餘的元素,就全部填充到temp

while( j <= right)

//(三)

//將temp陣列的元素拷貝到arr

//為什麼 t=0 ?

//因為合併的時候按圖所示陣列:

//最先進入的是84 left=0 right = 1

//經過上面的左邊與右邊比較,得出temp陣列:4,8

// 此時清空指向temp陣列的下標指標t 重新回到0

//templeft = 0 進行將temp陣列裡的4,8 賦值給arr陣列

t = 0;

int templeft= left;

while( templeft <= right)

}

分+合實現歸併排序

"並歸排序後"+ arrays.tostring(arr));

//分解方法

public static void mergesort(int arr, int left, int right, int temp)

mergesort(arr, left, mid, temp);

//向右遞迴進行分解

//mid+1 - midright 即是4 - 7

mergesort(arr, mid + 1, right, temp);

//進行合併

merge(arr,left,mid,right,temp);

}}執行結果如下:

templeft:0 rigth:1

templeft:2 rigth:3

templeft:0 rigth:3

templeft:4 rigth:5

templeft:6 rigth:7

templeft:4 rigth:7

templeft:0 rigth:7

並歸排序後[1, 2, 3, 4, 5, 6, 7, 8]

時間複雜度: t(n)

歸併演算法是乙個不斷遞迴的過程假設陣列的元素個數是n

時間複雜度是t(n)的函式:t(n) = 2*t(n/2) + o(n)

怎麼解這個公式呢?

對於規模為n的問題,一共要進行log(n)層大小切分;

每一層的合併複雜度都是o(n);

所以整體的複雜度就是o(nlogn)

空間複雜度: o(n)

由於合併n個元素需要分配乙個大小為n的額外陣列,合併完成之後,這個陣列的空間就會被釋放

排序演算法之歸併排序

歸併排序也是經典的使用分治法思想的代表演算法之一。歸併排序的效率很高,而且是一種穩定的排序。其總體的思想思路就是將待排序的元素分成大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排序的子集合合併成排好序的總集合 歸併排序c 實現如下 include void mergesort int arr...

排序演算法之歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。歸併排序基本原理 通過對若干個有序結點序列的歸併來實現排序。所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。歸併排序基本思...

排序演算法之歸併排序

歸併排序,和快排一樣同樣採用了分治的思想,將兩個 或以上 有序表合併成乙個新的有序表。歸併排序步驟如下 把n個記錄看成 n個長度為 1 的有序子表 進行兩兩歸併使記錄關鍵字有序,得到 n 2 個長度為 2 的有序子表 重複第2步直到所有記錄歸併成乙個長度為n的有序表為止。下面是歸併排序演算法的遞迴實...