排序演算法總結之 歸併排序

2021-07-02 23:01:34 字數 1501 閱讀 5007

歸併就是將兩個或多個有序的序列合併成乙個有序序列的過程。

二路歸併排序是面試中考查最多的排序演算法之一。

歸併排序有兩種:

1、一般歸併排序,空間複雜度o(n)

2、原地歸併排序,空間複雜度o(1)

基本思想:將兩個或者兩個以上的有序表合成乙個新的有序表。

歸併排序無論是順序儲存還是鏈式儲存結構都有較好的效能。

時間複雜度:o(nlogn)

空間複雜度:o(n)

是否穩定:是

舉例說明:對序列共七個元素的無序序列進行歸併排序。

其過程如下所示:

從上面的分析,容易看出,歸併排序是個遞迴的過程。遞迴過程的有兩步:分割 和 合併。

由此可以寫出以下**:

void msort(int record, int temp, int begin, int

end)

}

分析:這段**很簡單,共三個步驟:

1、將左半部分分割;

2、將有半部分分割;

3、將左右兩半合併;

其中,temp是和record一樣大小的輔助陣列。

下面來看下 合併操作。

合併兩個有序序列p , q的過程很簡單,直接看**:

(注意:需要使用p.length + q.length的輔助空間)

void merge(int record, int temp, int

begin, int mid, int

end)

while(lbegin <= lend)

temp[k++] = record[lbegin++];

while(rbegin <= rend)

temp[k++] = record[rbegin++];

while(begin

<= end)

}

以上就是一般歸併排序的核心過程。

完整**:

//合併子函式

void merge(int record, int temp, int begin, int mid, int end)

while(lbegin <= lend)

temp[k++] = record[lbegin++];

while(rbegin <= rend)

temp[k++] = record[rbegin++];

while(begin

<= end)

}//分割子函式

void msort(int record, int temp, int begin, int end)

}//歸併排序

void mergesort(int record, int length)

排序演算法之歸併排序

歸併排序也是經典的使用分治法思想的代表演算法之一。歸併排序的效率很高,而且是一種穩定的排序。其總體的思想思路就是將待排序的元素分成大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排序的子集合合併成排好序的總集合 歸併排序c 實現如下 include void mergesort int arr...

排序演算法之歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。歸併排序基本原理 通過對若干個有序結點序列的歸併來實現排序。所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。歸併排序基本思...

排序演算法之歸併排序

歸併排序,和快排一樣同樣採用了分治的思想,將兩個 或以上 有序表合併成乙個新的有序表。歸併排序步驟如下 把n個記錄看成 n個長度為 1 的有序子表 進行兩兩歸併使記錄關鍵字有序,得到 n 2 個長度為 2 的有序子表 重複第2步直到所有記錄歸併成乙個長度為n的有序表為止。下面是歸併排序演算法的遞迴實...