歸併排序的思想是:如果要對乙個陣列進行排序,可以先(遞迴地)將它分成兩半分別排序,然後將結果歸併起來。歸併演算法最吸引人的性質是它能保證將任意長度為n的陣列排序所需時間和 nlo
gn
nlogn
nlog
n 成正比;缺點則是它所需的額外空間和n成正比。
將兩個不同的有序陣列歸併起來,可以採用原地歸併的方法,這樣就可以先將前半部分排序,再將後半部分排序,然後在陣列中移動元素而不需要使用額外的空間。
下面就是對原地歸併的抽象方法:
// 該方法可以將子陣列 a[l...mid] 和 a[mid+1...r]歸併成乙個有序陣列,並存放在a[l...r]
// 子陣列 a[l...mid] 和 a[mid+1...r]都是有序的
void merge(int *a, int l, int mid, int r)
i = l;
j = mid + 1;
for(k=l; k<=r; k++)
else if(j > r)
else if(aux[i] > aux[j])
else
}delete aux;
}
【思想】
自頂向下的歸併排序應用了分治的思想。
【演算法過程】
如果要對子陣列 a[l
...r
]a[l...r]
a[l...
r]進行排序,自頂向下的歸併排序會先將 a[l
...r
]a[l...r]
a[l...
r]分為 a[l
...m
id
]a[l...mid]
a[l...
mid]
和 a[l.
..r]
a[l...r]
a[l...
r]兩部分,分別通過遞迴呼叫將它們單獨排序,最後將有序的子陣列歸併為最終的排序結果。
【**】
// 對陣列a[l..r]進行自頂向下的歸併排序
void top_down_sort(int *a, int l, int r)
【演算法分析】
對於長度為n的任意陣列,自定向下的歸併排序:
(1)時間複雜度為nlo
gn
nlogn
nlogn;
(2)空間複雜度為n;
(3)是穩定排序;
(4)不是原地排序。
【思想】
自底向上的歸併排序是一種非遞迴的方法,它的思想是:先歸併那些微型陣列,然後再成對歸併得到的子陣列,如此這般,知道將整個陣列歸併到一起。
【演算法過程】
自底向上的歸併排序,首先進行的是兩兩歸併(把每個元素想象成乙個大小為1的陣列),然後四四歸併(將兩個大小為2的陣列歸併成乙個4個元素的陣列),然後八八歸併,一直下去。例如:
對陣列[5, 4, 9, 2, 6]進行自底向上的歸併排序:
第一輪(兩兩歸併):
(5, 4) -> (4, 5) (9, 2) -> (2, 9)
第二輪(四四歸併)
(4, 5)(2, 9) -> (2, 4, 5, 9)
第三輪(八八歸併)
(2, 4, 5, 9)(6) -> (2, 4, 5, 6, 9)
在每一輪歸併中,最後一次歸併的第二個子陣列可能比第乙個陣列要小(例如上例中的第三輪,但這對merge()方法不是問題),否則兩個陣列應該是大小一樣的,而這在下一輪中子陣列的大小會翻倍。
【**】
// 對長度為n的陣列a進行自底向上的歸併排序
void down_top_sort(int *a, int n)
// 自底向上
void down_top_sort(int *a, int n)
else if(j > r)
else if(aux[i] > aux[j])
else
}delete aux;
}};int main()
; int i, j, k;
mergesort ms;
ms.down_top_sort(a, 8);
for(i=0; i<8; i++)
cout << endl;
return 0;
}
歸併排序對於長度為n的任意陣列:
(1)時間複雜度為nlo
gn
nlogn
nlogn;
(2)空間複雜度為n;
(3)是穩定排序;
(4)不是原地排序。
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。2 路歸併演算法 1.演算法基本思路 設兩個有序的子檔...
排序 歸併排序
利用遞迴的思想,當n 1時,只有乙個元素需要排序,為遞迴臨界條件 否則,遞迴的將前半部分資料和後半部分資料各自歸併排序,得到排序後的兩部分資料,然後再將得到的兩部分合併到一起。mergesort algorithm public void mergesort int data mergesort例程...