歸併排序簡介
歸併排序(MERGE-SORT)是建立在歸併操作上的一種有效的排序算法,該算法是採用分治法(Divide and Conquer)的一個非常典型的應用,時間複雜度爲O(n(logn)^2) 或O(nlogn)。
歸併排序的模擬過程可以看鏈接:MergeSortion
實現過程
爲了比較容易地理解插入排序,我們可以列出一組數據,比如:
1,5,4,3,7,6
歸併排序很好理解,簡單示意:
實現分治之後,再實現合併操作,整個過程就完成了。
代碼實現
首先是分治部分的實現:
int length = high - low;
for (int i = length / 2; i > 0; i = i / 2) {
mergeSort(a, low, low + i);
mergeSort(a, high - i, high);
_merge(a, low, i, high);
}
完整的代碼實現:
#include <stdio.h>
void print(const int *a, const int length) {
int i;
for (i = 0; i<length; i++) {
printf("%d ", a[i]);
}
putchar('\n');
}
void _merge(int *a, int low, int mid, int high) {
//合併兩個有序隊列
for (int i = 0; i < mid; i++) {
for (int j = mid; j < high; j++) {
if (a[i] > a[j]) {
exchange(a, i, j);
}
}
}
}
void mergeSort(int *a, const int low, const int high) {
if (low < high) {
int length = high - low;
if (length == 1) {
if (a[low] > a[high])
exchange(a, low, high);
}
for (int i = length / 2; i > 0; i = i / 2) {
mergeSort(a, low, low + i);
mergeSort(a, high - i, high);
_merge(a, low, i, high);
}
}
}
void main() {
const int length = 5;
int my_array[5] = {1,3, 5,2,5};
mergeSort(my_array, 0, length-1);
print(my_array, length);
}