之前寫了一篇介紹排序演算法的排序演算法之插入排序、希爾排序、歸併排序(c#),發現計算陣列的逆序對,我的演算法速度比別人要慢很多倍。下面來分析一下為什麼這兩種歸併演算法會相差那麼多。
第一種慢速歸併演算法,**如下
///
/// 歸併排序
///
///
public
int[
]mergesort
(int
array)
//陣列擷取成左右兩個
int[
] left = array.
take
(half)
.toarray()
;int
right = array.
skip
(half)
.toarray()
;//遞迴 直至分成 左右兩個只含乙個元素時 排序後 向上返回
left =
mergesort
(left)
; right =
mergesort
(right)
;return
mergesortdouble
(left, right);}
///
/// 對兩個陣列排序後合併成乙個返回
///
///
///
///
public
int[
]mergesortdouble
(int
left,
int[
] right)
else
}while
(left.
count()
> leftpositon)
while
(right.
count()
> rightposition)
return li.
toarray()
;}
分析原因如下,**使用了多次遞迴,每次遞迴均新建了多個陣列進行執行。且存在陣列和list的之間轉換。較為浪費時間。
參考其他歸併排序,對**優化後如下。
public
static
void
sort
(int
arr)
private
static
void
sort
(int
arr,
int left,
int right,
int[
] temp)
}private
static
void
merge
(int
arr,
int left,
int mid,
int right,
int[
] temp)
else
}while
(i <= mid)
while
(j <= right)
t =0;
//將temp中的元素全部拷貝到原陣列中
while
(left <= right)
}
總結,減少建立物件,減少裝箱拆箱的轉換以及其他型別轉換,能不新增空間就不新增空間。 排序演算法之歸併排序
歸併排序也是經典的使用分治法思想的代表演算法之一。歸併排序的效率很高,而且是一種穩定的排序。其總體的思想思路就是將待排序的元素分成大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排序的子集合合併成排好序的總集合 歸併排序c 實現如下 include void mergesort int arr...
排序演算法之歸併排序
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。歸併排序基本原理 通過對若干個有序結點序列的歸併來實現排序。所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。歸併排序基本思...
排序演算法之歸併排序
歸併排序,和快排一樣同樣採用了分治的思想,將兩個 或以上 有序表合併成乙個新的有序表。歸併排序步驟如下 把n個記錄看成 n個長度為 1 的有序子表 進行兩兩歸併使記錄關鍵字有序,得到 n 2 個長度為 2 的有序子表 重複第2步直到所有記錄歸併成乙個長度為n的有序表為止。下面是歸併排序演算法的遞迴實...