归并操作的工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
//利用啦分治的思想
#include <stdio.h>
#include <stdlib.h>
void Moerage(int a[], int b[], int heard, int moiety, int end) {
int i, j, k;
i = heard;//代表的是传过来的数组的分成两份左边份的第一个数
j = moiety + 1;//代表的就是右边那份的第一位
k = heard;
/*三个while的作用就是分别把两个数组的第一位到最后一位进行一一比较把从小到大的数字依次存入数组b[]中*/
while (i < moiety + 1 && j < end + 1) {
if (a[i]>a[j]) {
b[k] = a[j];
j++;
}
else {
b[k] = a[i];
i++;
}
k++;
}
/*这里的两个while是把i开始或j开始的数组中比较后剩余的数据全部接着存入b[]中*/
while (i < moiety + 1) {
b[k] = a[i]; k++, i++;
}
while (j < end + 1) {
b[k] = a[j]; k++, j++;
}
/*将数据移入a[]数组中为下一次的递归做准备,b[]数组其实只是交换时的容器,每一次的递归数组还是以a[]数组为主来二分*/
for (i = heard; i < end + 1; i++) {
a[i] = b[i];
}
}
void Interior(int a[], int b[], int heard, int end) {
int moiety;
if (heard < end) {
moiety = (heard + end) / 2;//将数组分成两份
Interior(a, b, heard, moiety);//递归调用,一直将分成两份的前一个继续分成两个
Interior(a, b, moiety + 1, end);//递归调用,一直将分成两份的后一个继续分成两个
Moerage(a, b, heard, moiety, end);//将分成的数组进行排序
}
}
int main() {
int i, n;
int *a;
int *b;
printf("输入需要比较的数的个数:\n");
scanf("%d", &n);
a = (int *)malloc(sizeof(int) * n);
printf("输入%d个数字:\n", n);
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
b = (int *)malloc(sizeof(int)*n);
Interior(a, b, 0, n - 1);
printf("排序后的序列:");
for (i = 0; i < n; i++)
if (i < n - 1)
printf("%d,", a[i]);
else
printf("%d", a[i]);
return 0;
}
结果截图