归并排序简介
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,时间复杂度为O(nlog₂n) 。
归并排序的模拟过程可以看链接: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);
}