二分歸併排序 (十七)排序 歸併

2021-10-12 07:56:13 字數 2591 閱讀 5841

源於生活,抽象生活。

歸併排序是軟體演算法中「分治法」的乙個典型應用。

金字塔思維

分治法的思路就再普通不過了。從軟體模組分層設計到國家治理統一。

不過我覺得金字塔思維,至少都應該了解一下。

「分治法」的思想我們在快速排序中有簡單的介紹過,簡單的理解成複雜問題解決的「大象放冰箱」三步走:

對應於乙個大的無序序列的排序就是:

歸併排序思路

歸併排序效果

好了,我們了解了歸併排序和分治法的思想,老規矩,還是要躬親實踐一下。

一般來說,採用分治法的演算法思路都可以採用遞迴來實現,我們在快速排序也講過遞迴的思路:

不過有意思的是,這三個步驟是充要條件但是順序卻可以調整。

比如快速排序中,排序是由大及小,所以順序是先實現,再遞迴;

但是在歸併排序中,就需要先分解遞迴,再排序;

所以如果按照順序的話,在歸併排序中的遞迴順序為:

好了,我們來實現以下吧:

注意事項:

2. 歸併實現中,分容易理解,合的過**的有點浪費空間,還要copy。

mysort.h

#ifndef __my_sort_h__

#define __my_sort_h__

#include #include #include "bintree.h"

typedef enum updown

up_down;

class mysort

;#endif // !__my_sort_h__

mysort.cpp

bool mysort::mergesortimp(int *pmer, int icap, int *ptemp, up_down up_down)

int *pleft, *pright;

int lenleft, lenright, indleft, indright;

pleft = pmer, lenleft = icap / 2;

pright = pmer + lenleft, lenright = icap - lenleft;

mergesortimp(pleft, lenleft, ptemp, up_down);

mergesortimp(pright, lenright, ptemp, up_down);

int i;

for (i = 0; i < icap; i++)

indleft = 0, indright = lenleft;

for (i = 0; i < icap; i++)

if (indright == icap)

if(up == up_down)

else

}else if (down == up_down)

else

}} return true;

}bool mysort::mergesort(up_down up_down)

int* pmerge = new int[m_icap];

int* ptemp = new int[m_icap];

if (nullptr == pmerge || nullptr == ptemp)

m_ulcount = 0;

memset(pmerge, 0, sizeof(pmerge[0]) * m_icap);

memset(ptemp, 0, sizeof(ptemp[0]) * m_icap);

memcpy(pmerge, m_iparray, sizeof(pmerge[0]) * m_icap);

mergesortimp(pmerge, m_icap, ptemp, up_down);

showarray(pmerge, m_icap);

printf("merge sort takes [%lu] times when n = [%d] n", m_ulcount, m_icap);

deletepmerge;

deleteptemp;

return true;

}

測試**:

#include "mysort.h"

#include "bintree.h"

#define len(x) (sizeof(x)/sizeof(x[0]))

using namespace std;

int myarray = ;

int main()

輸出:

好了,通過上面的**,我們可以看到,對於實現排序演算法的時間複雜度為

歸併排序 二分

歸併排序就是將陣列反覆拆分成兩部分,然後分別在這兩部分裡面再反覆拆分,講拆分成的兩部分按順序排好之後再歸併起來,歸併起來之後再反覆交換位置,最終使整個陣列按順序排列。具體操作方法 按從小到大排 拆分成的兩部分依次比較,若前半部分的較小,將其存入陣列tmp中,將前面的下標i 若後面一部分較小,則將後面...

二分歸併排序

對n個不同的數構成的陣列a 1 n 進行排序,其中n 2 k。二分歸併排序對待排序陣列先劃分後歸併,以陣列49,38,65,97,76,13,27,57為例,在二分歸併中,需要進行如下順序 劃分將原問題歸結為規模為n 2的2個子問題 繼續劃分,將原問題歸結為規模為n 4的4個子問題。繼續 當子問題規...

二分歸併排序

1.問題 二分歸併排序 對n個不同的數構成的陣列a 1 n 進行排序,其中n 2 k 2.解析 1 對於一組資料a n 申請臨時空間,temp n 用於臨時存放資料,劃分為兩個序列 2 設定兩個指標分別指向兩個序列的首部,其中中間資料mid start end 2劃分到前乙個序列當中 3 比較兩個指...