风之城的归并排序 #include<stdlib.h> #include<stdio.h> void merge(int arr[], int l, int m, int r) { int i,j,k; //n1为mid左边数组的大小 //n1为mid右边数组的大小 int n1 = m - l + 1; int n2 = r - m; //将数组初始化 int L[n1]={0}; int R[n2]={0}; //将arr中的部分数组复制到L数组和R数组 for(i=0;i<n1;i++) L[i] = arr[l+i]; for(j=0;j<n2;j++) R[j] = arr[m+j+1]; i = 0; j = 0; k = l; //左边的数组和右边的数组比较 //左边的指针从i开始到n1 - 1的位置 //右边的指针从j开始到n2 - 1的位置 //一一比较把小的数从l位置开始替换原数组 while(i < n1 && j < n2) { if(L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } //如果有一个数组没有完全比较完,另一个数组就完全结束了,那么可以把没结束的直接放入arr数组 while(i < n1) { arr[k]=L[i]; i++; k++; } while(j < n2) { arr[k]=R[j]; j++; k++; } } //分而治之,现将左边部分排序好