涉及到递归,可以看我前面写的:https://blog.csdn.net/2302_79366101/article/details/134188951https://blog.csdn.net/2302_79366101/article/details/134188951
如图所示,这就是归并排序的大致流程。我们分为:分解与归并。既然已经有了思路,我们思考一下代码如何实现。首先,这是以一种分治的思想。我们要把求顺序的大问题分解为小问题。
在此我们再使用文字描述一下这个过程:
将子数组分到其中只有一个元素,此时我们就可以认为这个子数组是有序的,然后在得到左右两个这样只有一个元素的子数组后进入归并merge,得到一个更大的有序数组如圈1时的数组,其他子数组和这个过程相同,直至将所有其全部归并我们就会得到一个有序数组。
根据上面汉诺塔的经验,我们得出同样的思路,既然我们想要实现
我们只需要一个分,和一个治即可
分的思路已经给出,
治:
便是:已经有两个各自排好序的数组,我们从他们第一个数据开始比较,如果左第一个比右第一个小,那么我们直接给temp数组的第一个元素赋值左边第一个数,然后做比左边数组移动到下一位,如果等于或者大于右边的话,则把右边的赋值给temp,最后temp移动一位。
于是我们有代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void merge(int* src, int* dst, int begin, int mid, int end)
{
int begin1 = begin;
int begin2 = mid;
int index = begin;
while (begin1 < mid && begin2 < end) {
if (src[begin1] < src[begin2]) {
dst[index++] = src[begin1++];//[index++]由于运算的优先级,它用于自增一个变量的值,并返回自增前的值。
}
else {
dst[index++] = src[begin2++];
}
}
while (begin1 < mid) {
dst[index++] = src[begin1++];
}
while (begin2 < end) {
dst[index++] = src[begin2++];
}
memcpy(src + begin, dst + begin, (end - begin) * sizeof(int));
}
void _merge_sort(int* arr, int* tmp, int left, int right)
{
if (left + 1 >= right) {
return;
}
int mid = left + (right - left) / 2;
_merge_sort(arr, tmp, left, mid);
_merge_sort(arr, tmp, mid, right);
merge(arr, tmp, left, mid, right);
}
void merge_sort(int* arr, int size)
{
int* tmp = (int*)malloc(size * sizeof(int));
_merge_sort(arr, tmp, 0, size);
free(tmp);
}
int main()
{
int arr[] = { 3,6,1,9,4,2,0,5,8,7 };
int len = sizeof(arr) / sizeof(arr[0]);
merge_sort(arr, len);
int i = 0;
for (i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
上述代码过于复杂,可以进行简化:
思路同上:
#include <iostream>
using namespace std;
const int N=1e5 + 10;
int q[N], tmp[N];
//m输入的是n-1
void merge_sort(int q[], int l, int m)
{
if (l >= m) return;
int mid = (l + m) >> 1;
merge_sort(q, l, mid);
merge_sort(q, mid + 1, m);
int i = l, j = mid+1;
int k = 0;
while (i <= mid && j <= m)
{
if (q[i] <= q[j]) tmp[k++] = q[i++];
else tmp[k++] = q[j++];
}
while (i <= mid) tmp[k++] = q[i++];
while (j <= m) tmp[k++] = q[j++];
for (i = l, j = 0; i <= m; i++, j++) q[i] = tmp[j];//数组转移
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> q[i];
}
merge_sort(q, 0, n - 1);
for (int i = 0; i < n; i++)
{
cout << q[i];
}
}
它整体的过程如下:
END ps:我只是个初学者,全靠自学,所以知识上面肯定有很多漏洞,所以请多海涵! 感谢批评指正!