#include <stdio.h>
void Copy(int *a, int *b, int left, int right) {
int i;
for(i=0;i<right-left+1;i++)
{
a[i+left] = b[i];
}
}
// 将 a[left,middle] 和 a[middle+1,right]合并到 b[left, right]中
void Merge(int *a, int left, int middle, int right) {
int b[right-left+1];
int i = left; // left 到 middle 这一段的起始位置
int j = middle + 1; // middle+1 到 right 这一段的起始位置
int k = 0; // 保存到 b 数组中的对应位置索引
int q; // 循环变量
// 当 a[1,middle] 和 a[middle+1,right] 中都有元素时,小的保存到 b 数组中
while((i<=middle)&&(j<=right)){
if(a[i]<=a[j]){
b[k] = a[i];
i++;
}else{
b[k] = a[j];
j++;
}
k++;
}
// 把余下部分加入到数组中
if(i>middle){ // 将 a[middle+1,right]中剩余部分拷贝到 b 数组当中
for(q=j; q<=right; q++){
b[k] = a[q];
k++;
}
}else{ // 将 a[1,middle]中剩余部分拷贝到 b 数组当中
for(q=i; q<=middle; q++){
b[k] = a[q];
k++;
}
}
Copy(a, b, left, right); // 复制回数组 a
}
// 递归写法
void MergeSort(int *a, int left, int right){
int middle;
if(left < right){ // 当至少有两个元素时
middle = (left + right)/2; // 取中点
MergeSort(a, left, middle); // 对 a[left,middle] 进行合并排序
MergeSort(a, middle+1, right); // 对 a[middle+1,right] 进行合并排序
Merge(a, left, middle, right); // 合并到数组 a
}
}
int main() { //定义 main()主函数
int arrayLength,i;
printf("请输入要合并排序的数组大小:(数组最大上限100)\n");
scanf("%d",&arrayLength);
int a[arrayLength];
printf("请输入待排序序列:\n");
for(i=0; i<arrayLength; i++){ //a控制数组大小
scanf("%d",&a[i]);
}
MergeSort(a, 0, arrayLength-1);
printf("合并排序后的数组为:\n");
for( i=0; i<arrayLength; i++){
printf("%d ",a[i]);
}
return 0;
}