歸併演算法即一種分治策略,將大問題劃分為n個小問題,然後對n小問題求解組合成大問題的解。
在使用遞迴的分治排序中,涉及三個問題:一、小問題的不可劃分的或者終止條件;二、陣列的拆分;三、已排序的兩個陣列的合併。
以下**是不使用遞迴的分治排序演算法,考慮可以結合多執行緒,使速度更快。
分治演算法是用空間換來時間的演算法,遞迴很消耗記憶體。package main;
import util.mrand;
import util.mtime;
/***
* 歸併排序
* @author administrator
* */
public class mergesort extends thread
//拆分左右陣列部分
int leftlength = a.length/2;//左邊部分的陣列長度
int rightlength = a.length-a.length/2;//右邊部分的陣列長度
int l = new int[leftlength];
int r = new int[rightlength];
for(int i = 0;ir[r])
}}
開始0
1萬條資料,歸併排序耗時:5
100萬條資料,歸併排序耗時:188
1萬條資料,插入排序耗時:55
開始01萬條資料,歸併排序耗時:1
100萬條資料,歸併排序耗時:158
1萬條資料,插入排序耗時:34
開始01萬條資料,歸併排序耗時:2
100萬條資料,歸併排序耗時:150
1萬條資料,插入排序耗時:11
開始01萬條資料,歸併排序耗時:1
100萬條資料,歸併排序耗時:164
1萬條資料,插入排序耗時:10
此外在待排序的數字值小於某個數時,插入排序效能將由於歸併排序,所以可以將歸併排序改進,將葉節點變粗,即在問題縮小到一定規模時(而不是不可劃分),使用插入排序,再返回排序好的陣列,使用歸併排序的合併機制來合併陣列。
時間複雜度分析:對於歸併排序,每次將問題分解成兩個小問題,即t(n)=2t(n/2)+d(n)+c(n),其中d(n)表示將分解子陣列的時間,c(n)表示合併子陣列的時間,d(n)+c(n)=r(n)。問題規模為n,則樹深log2 n,則根據主定理證明,t(n)=nlog2 n。
此外對於基本排序好的數列,使用插入排序的速度優於歸併排序。
演算法導論第二章(歸併排序)
歸併排序,主要思想是分治法。相當於兩堆已排序好的撲克牌,每一次選擇兩堆牌頂上較小的那乙個,放到合併堆。最壞情況o nlogn 平均情況o nlogn package chapter2 public class mergesort mergesortfunction arr,0,9 for int i...
演算法導論 第二章演算法入門 合併排序
include include include include using namespace std 讀入檔案 void inputfile vector vec 合併程式 void merge vector vec,int p,int r,int q for j 1 j n2 j 這個是作為哨兵...
學習《演算法導論》第二章 合併排序 總結
分治策略 將原問題劃分成n個規模較小而結構與原問題相似的子問題 遞迴地解決這些子問題,然後再合併其結果,就得到原問題的解.分治模式一般有三個步驟 分解 將原問題分解成一系列子問題 解決 遞迴地解決各子問題 合併 將子問題的結果合併成原問題的解 合併排序直觀地操作如下 分解 將n個元素分成n 2個元素...