排序演算法(4) 歸併排序

2021-08-27 22:34:02 字數 1555 閱讀 4695

簡介:歸併排序是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。

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

一、主要步驟

將待排序陣列[0...n-1]看成是n個長度為1的有序序列,將相鄰的有序表成對歸併,得到n/2個長度為2的有序表;將這些有序序列再次歸併,得到n/4個長度為4的有序序列;如此反覆進行下去,最後得到乙個長度為n的有序序列。

綜上可知:

歸併排序其實要做兩件事:

(1)「分解」——將序列每次折半劃分。

(2)「合併」——將劃分後的序列段兩兩合併後排序。

二、演示過程

1、先看合併

(1)、兩端相鄰的有序子陣列,arr[start]~arr[mid] 稱為陣列a和arr[mid+1]~arr[end] 稱為陣列b

(2)、每次各從陣列a和陣列b中取出乙個值相比較,小的乙個放到臨時陣列c

(3)、最後陣列a和陣列b中的資料取完時,陣列c就是乙個有序的合併後的陣列。

(4)、最後在臨時陣列複製到原陣列中

2、在看分解

(1)、先把陣列分成最細,gap=1,然後把相鄰的兩個資料合併排序

(2)、然後設定gap=2,繼續把相鄰的兩個陣列合併。若子表個數為奇數,則最後乙個子表無須和其他子表歸併(即本趟處理輪空);

若子表個數為偶數,則要注意到最後一對子表中後乙個子表區間的上限為n-1。

(3)、直到gap等於陣列的長度,陣列合併完成

如圖所示:

三、**實現

@override

public void sort(int arr)

private void merge(int array,int start,int mid,int end)else

temparrindex++; }

//2.當第一段沒有複製完全時,將剩餘的陣列全部複製到臨時陣列

while(firstarrindex<=mid)

//3.當第二段沒有複製完全時,講剩餘的陣列全部複製到臨時陣列

while(secondarrindex<=end)

//4.將臨時陣列複製到原始陣列

for(temparrindex=0,firstarrindex=start;firstarrindex<=end;temparrindex++,firstarrindex++)

}private void mergesort(int arr)

// 餘下不足兩個合併的子陣列。保證第乙個陣列gap存在。

if(i + gap - 1 < arr.length)

}}

4 歸併排序演算法

1 歸併排序 merge sort 基本思想 歸併排序法是將兩個或兩個以上的有序表合併成乙個新的有序表 即將待排序的序列分成若干個子串行,每個子串行是有序的,然後再把有序子串行合併為整體子串行 利用歸併的思想實現二路歸併排序的實現步驟 首先將整個資料表看成是n個有序子表,每個子表長度為1 當然有序啦...

內部排序演算法4(歸併排序)

將兩個有序表合成乙個新的有序表就是二路歸併。例如,在元素序列l中有兩個已經排好序的有序順序表l left l mid 和l m id 1 l righ t 它們可以歸併成為乙個有序表,仍然存放於l left l righ t 中。在歸併排序中,用變數 i 和 j分別做 l 中兩個表的當前檢測指標,用...

排序演算法積累 4 歸併排序

一 歸併排序思路 大體思路就是將資料在中位數的位置分成兩個區間,一直重複,直到最後節點只有乙個數 二 程式 include include include 用setprecision n 設定精度,其中n表示精確到小數點後n位 using namespace std void merge int a...