歸併排序演算法

2021-10-03 16:40:40 字數 1707 閱讀 8049

歸併排序(merge-sort)是利用歸併的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer)策略;

分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之;

1>.基本示意圖

2>.合併相鄰有序子串行示意圖

1>.將原始列表變成兩段有序的列表;

2>.將兩段有序的列表歸併到一起,實現最終的排序;

3>.最後將臨時列表中的元素拷貝到原始列表中;

排序過程說明:

4>.時間複雜度:o(n*logn);

/**

* description: 歸併排序

*/public

class

mergesorttest

;mergesort

(arr,

0, arr.length -1)

; system.out.

println

(arrays.

tostring

(arr));

}/**

* 列表拆分成兩個有序的列表

** @param arr 原始列表

* @param start 本次參與拆分的列表的起始索引

* @param end 本次參與拆分的列表的最終索引

*/public

static

void

mergesort

(int

arr,

int start,

int end)

}/**

* 合併

** @param arr 參與排序的元素列表

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

* @param mid 中間索引,將列表分為兩部分

* @param right 右邊有序列表的最終索引

*/public

static

void

merge

(int

arr,

int left,

int mid,

int right)

if(arr[i]

> arr[j])}

//最後將另外乙個有序列表中剩下的元素依次全部填充到臨時列表temp中

//如果是左邊有序列表中的元素全部都填充到了臨時列表temp中,而右邊有序列表中的元素還沒有全部填充到臨時列表temp中

//那麼就將右邊有序列表中的元素填充到臨時列表temp中

while

(j <= right)

//將左邊有序列表中的元素填充到臨時列表temp中

while

(i <= mid)

//將臨時列表temp中的元素重新拷貝到原始列表arr中

for(

int k =

0; k < temp.length; k++)}

}

輸出結果:

歸併演算法 歸併排序

歸併演算法 歸併排序 這周需要用到歸併演算法,於是找了找相關的資料,整理如下 歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low...

歸併排序演算法

include stdafx.h include include include 合併兩段已經排好序的列表 void merge int list int mergelist int left int mid int right else if i mid else 將列表list按照seglen分...

歸併排序演算法

這個演算法感覺比插入難理解一些,下面說說我的理解 歸併排序的步驟 1.把長度為n的序列分為兩個長度為n 2的子串行 2.對這兩個子串行分別採用歸併排序 3.將兩個子串行合併成乙個最終的排序序列 通過步驟2可看到 在歸併排序中又用了歸併排序,可見這是乙個遞迴的過程。例如乙個陣列 a 8 下面採用遞迴排...