源於生活,抽象生活。
歸併排序是軟體演算法中「分治法」的乙個典型應用。
金字塔思維
分治法的思路就再普通不過了。從軟體模組分層設計到國家治理統一。
不過我覺得金字塔思維,至少都應該了解一下。
「分治法」的思想我們在快速排序中有簡單的介紹過,簡單的理解成複雜問題解決的「大象放冰箱」三步走:
對應於乙個大的無序序列的排序就是:
歸併排序思路
歸併排序效果
好了,我們了解了歸併排序和分治法的思想,老規矩,還是要躬親實踐一下。
一般來說,採用分治法的演算法思路都可以採用遞迴來實現,我們在快速排序也講過遞迴的思路:
不過有意思的是,這三個步驟是充要條件但是順序卻可以調整。
比如快速排序中,排序是由大及小,所以順序是先實現,再遞迴;
但是在歸併排序中,就需要先分解遞迴,再排序;
所以如果按照順序的話,在歸併排序中的遞迴順序為:
好了,我們來實現以下吧:
注意事項:
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 比較兩個指...