歸併排序採用的是分——合的策略,什麼是分?什麼是合?我們舉個例子,例如要對長度為n的序列a排序,我們可以將序列a均分成兩個部分,並且對著兩個部分分別進行排序,這便是分。將排好序的兩個部分按順序整合到一起,這便是合。這樣通過先分再合,就對序列a進行了排序。
歸併序列的難點在於合,兩個排好序的序列如何合併成乙個序列呢?(本文採用小到大的排序)通過比較兩個序列的第乙個數得到較小的乙個,取該數賦值給合併序列的第1個數,並刪除該數,然後再比較兩個序列的第乙個數,並取得較小的乙個,取該數賦值給合併序列的第2個數,並刪除該數。依次類推直到合併序列被填滿。
static int b=new int[100000];
static void mergearray(int l,int r)
int x=l;int y=mid+1;
for(int i=l;i<=r;i++)
else if(y>r)
else if(b[x]
從上面的**可以分析出,要合併乙個長度為n的序列,複雜度為o(n)。
合是在兩個已經排好序的序列的基礎上進行的,假設a、b兩個序列都已經排好序,那麼很容易將這兩組序列合併。那麼如何讓a、b有序呢?我們可以採用同樣的策略分別對a、b進行排序,即將a、b分別均分成兩個部分。依次類推,知道序列中只剩下乙個數,我們就認為該序列是有序的。然後再講這些有序序列兩兩合併。
static void mergesort(int l,int r)
排序七部曲之(七)希爾排序
希爾排序的原理 本質上是插入排序。插入排序在某些情況下效率是很高的,比如需要排序的序列基本有序時,插入排序的效率可以接近o n 那麼問題在於,現實中的序列基本上都是不滿足基本有序的,如何使乙個序列在進行插入排序前是滿足基本有序的呢?科學家希爾將插入排序進行了改進,提高了排序的效率。希爾排序的實現 將...
排序 五 之歸併排序
歸併排序是乙個相當 穩定 的演算法對於其它排序演算法,比如希爾排序,快速排序和堆排序而言,這些演算法有所謂的最好與最壞情況。而歸併排序的時間複雜度是固定的,它是怎麼做到的?首先來看歸併排序要解決的第乙個問題 兩個有序的陣列怎樣合成乙個新的有序陣列,比如陣列1 3,5,7,8 陣列2為 1,4,9,1...
排序五 歸併排序
寫作功底有限,不明白的推薦看一下麻省理工學院的演算法導 開課。歸併演算法是指將兩個有序序列合併為乙個有序序列的方法。例如,現有兩個有序序列a 1,3,5 b 2,4,6 將其合併為乙個序列c。分別對a,b建乙個游標索引,初始值為0。第一步比較a,b索引的值a 1,3,5 b 2,4,6 1 2,所以...