一、效能:
時間複雜度總為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 下面採用遞迴排...