排序演算法之歸併排序演算法優化

2021-10-23 09:18:35 字數 1739 閱讀 3174

之前寫了一篇介紹排序演算法的排序演算法之插入排序、希爾排序、歸併排序(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的有序表為止。下面是歸併排序演算法的遞迴實...