讀書日記 歸併排序演算法

2022-04-12 15:20:14 字數 1563 閱讀 6520

一、效能

時間複雜度總為o(nlgn)。

二、思想:

遵循分治法的思想:將原問題分解為幾個規模較小但類似於原問題的子問題,遞迴地求解這些子問題,然後再合併這些子問題的解來建立原問題的解。

演算法導論對歸併排序的描述是:

分解:分解待排序的n個元素的序列成各具有n/2個元素的兩個子串行。

解決:使用歸併排序遞迴地排序兩個子串行。

合併:合併兩個已排序的子串行以產生已排序的答案。

即,1、不斷平分序列,分解至序列長度為1。(此時不用比較,長度1的每個序列都已排好序)

2、遞迴"回公升",將兩個已排序的序列通過比較進行合併。

三、例子:

9620

6033

7202

4257

2250

對以上序列進行歸併排序: 

1、遞迴分解至序列個數為1。

->                               n = 10

->  ,         n =  5

->  ,,,       n  =  2|3

->   ,,,,,,,   n  = 1|2

-> ,,,,,,,,,  n =1

2、兩兩序列合併,遞迴"回公升",比較排序

-> ,,,,,,,,,  n =  1

->   ,,,,,,,         n  = 1|2

->    ,,,          n  = 2|3

->    ,            n =  5

->                   n =  10

三、**:

/*

@param intarr 待排序輸入陣列

@param p 起始位置

@param q 中間位置

@param r 結束位置

@param tarr 快取陣列用於比較快取

*/void merge(int* intarr,int p,int q,int r,int*tarr)

else

}}/*

@param intarr 待排序輸入陣列

@param p 起始位置

@param r 結束位置

@param tarr 快取陣列用於比較快取

*/void mergesort(int* intarr,int p,int r,int*tarr)}//

實際呼叫函式,一開始建立足夠大的tarr陣列,避免重複建立刪除

void mergesort_real(int* intarr,int p,int

r)}

歸併演算法 歸併排序

歸併演算法 歸併排序 這周需要用到歸併演算法,於是找了找相關的資料,整理如下 歸併排序 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 下面採用遞迴排...