3、歸併排序:將陣列不斷拆分,拆分為多個只包含單個元素的陣列。再將陣列不斷有序合併,合併為乙個有序的陣列。遞迴、合併簡稱歸併,合併都能理解,那什麼是遞迴呢,遞迴其實就是在一次大規模運算中,其中的一步或幾步計算用到了前面的運算結果,舉個例子:第一天給你一塊錢,第二天給你兩塊錢,第三天四塊,以此類推每天給你的錢都是前一天的一倍,最後要計算100天後一共給了你多少錢。這就是典型的遞迴,計算某天得到的錢數,需要計算前一天的錢數的運算結果。
舉例:原始陣列:(28 12 1 8 23 32 6 19)
第一次拆分:(28 12 1 8)(23 32 6 19)
第二次拆分:(28 12)(1 8)(23 32)(6 19)
第三次拆分:(28)(12)(1)(8)(23)(32)(6)(19)
第一次合併:(12 28)(1 8)(23 32)(6 19)
第二次合併:(1 8 12 28)(6 19 23 32)
第三次合併:(1 6 8 12 19 23 28 32)
分析:進行log(2)(n)=log(2)(8)=3次的拆分後,拆分為n=8個單元素的陣列。再進行3次的有序合併後,合併為8個元素的有序陣列。
**邏輯:因為拆分和合併都是相同的操作,所以只需要寫乙個拆分的函式,再寫乙個合併的函式,然後在拆分的函式中呼叫自己(自己呼叫自己,相當於我秀我自己,鐵鍋燉自己?)。拆分函式需要找到中間值,然後呼叫sublist()函式進行拆分,最後return呼叫合併函式為最終結果即可。合併函式需要迴圈n次(n為兩個需要合併陣列的大小總和),每次取出兩個陣列中最小的元素,放入返還陣列中。
**示例(**工具-as):
public
static
void
main
(string args)
/**
* 歸併排序
* @param list 需要排序的陣列
* @return 排序成功的陣列
*/private
static arraylist
split
(arraylist
list)
int i = list.
size()
/2;//取list大小一半的值,為了平均拆分list
arraylist
leftlist =
split
(new
arraylist
<
>
(list.
sublist(0
,i)));
//拆分後左側的list
arraylist
rightlist =
split
(new
arraylist
<
>
(list.
sublist
(i,list.
size()
)));
//拆分後右側的list
return
merge
(leftlist,rightlist)
;}
/**
* 將兩個有序陣列有序合併為乙個陣列
* @param leftlist 第乙個有序陣列
* @param rightlist 第二個有序陣列
* @return 合併的陣列
*/private
static arraylist
merge
(arraylist
leftlist,arraylist
rightlist)
else
if(rightlist.
size()
<1)
else
else}}
return relist;
}
/**
* 列印陣列
* @param list 要列印的陣列
* @param string 列印字首
*/private
static
void
log(arraylist
list,string string)
else}if
(string == null)
else
}
結果一覽
結果分析:歸併排序要拆分至成n(n為陣列元素個數)個單一元素的陣列,再將這些單一陣列有序合併成幾次後合併為乙個陣列,無論陣列的元素順序,耗費的時間均相同
排序演算法 3 歸併排序
這篇博文分為四個部分 歸併排序基本思想 基礎 實現與解析 一次優化 二次優化 自底向上的歸併排序 1.歸併排序基本思想 3 歸併排序 小到大排序 1.迴圈的將每乙個部分都分為原來的一半 直到最後每一部分只剩下乙個元素 2.迴圈的將每兩個部分進行合併並且排序 直到最後全部合併 o n log n 2....
常見的排序演算法示例(3) 歸併排序 堆排序
一 歸併排序演算法 基本思想 歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併排序示例 合併方法 設r i n 由兩個有序子表r i m 和r m 1 n 組成,兩個子表長度分別為...
排序演算法總結之 歸併排序
歸併就是將兩個或多個有序的序列合併成乙個有序序列的過程。二路歸併排序是面試中考查最多的排序演算法之一。歸併排序有兩種 1 一般歸併排序,空間複雜度o n 2 原地歸併排序,空間複雜度o 1 基本思想 將兩個或者兩個以上的有序表合成乙個新的有序表。歸併排序無論是順序儲存還是鏈式儲存結構都有較好的效能。...