原理
核心思想:分而治之
具体步骤:
-
如果数据规模大于1
-
将数据平均分成左右两份
-
再递归排序左右两份
-
最后有序合并左右两份
-
性能
时间复杂度:O(n * logn)
空间复杂度:O(n)【在原数组上合并时】,O(n * logn)【复制数组进行合并时】
代码
输入:数组地址,数组首元素下标,数组尾元素下标
输出:升序排列的数组
merge_sort.c
void merge(int *arr, int left, int mid, int right)
{
//在原数组上操作,类似插入排序,将后面的数据,有序插入进前面的数组
for (int i = mid + 1; i <= right; ++i) {
//保存来牌
int val = arr[i];
//给来牌腾位置
int j = i - 1;
for (; j >= left; --j) {
if (arr[j] > val) {
arr[j + 1] = arr[j];
}
else {
break;
}
}
//插入来牌
arr[j + 1] = val;
}
}
void merge_sort(int *arr, int left, int right)
{
if (left < right) {
int mid = (left + right) / 2;
merge_sort(arr, left, mid);
merge_sort(arr, mid + 1, right);
//合并有序数组
merge(arr, left, mid, right);
}
}