算法流程:分解数组,递归求解,合并排序。
-
将数组A[1,n]排序 问题分解为A[1,[n/2]]和A[[n/2]+1,n]排序问题
-
递归解决子问题得到两个有序的子数组
-
将两个有序子数组合并为一个有序数组
代码
#include <stdlib.h>
int a[100];//输入数组
int b[100];//暂存数组
int n;//数组长度
void merge_sort(int left, int right);//分割数组
void merge(int left1, int left2, int right);//合并数组
int main()
{
int i;
printf("请输入数组长度:");
scanf("%d", &n);
printf("请输入数组:\n");
for(i=0; i<n; i++){//输入
scanf("%d", &a[i]);
}
merge_sort(0,n-1);
for(i=0; i<n; i++){//输出
printf("%d ",a[i]);
}
return 0;
}
void merge_sort(int left, int right){
if(left >= right){
return ;
}
int mid = (left+right)/2;
merge_sort(left, mid);
merge_sort(mid+1, right);
merge(left, mid, right);
}
void merge(int left, int mid, int right){
int i = left;
int j = left;
int k = mid+1;
int m;
for(m = 0; m < n; m++){
b[m] = a[m];
}
while(j <= mid && k <= right){
if(b[j] <= b[k]){
a[i] = b[j];
i++;
j++;
}
if(b[j] > b[k]){
a[i] = b[k];
i++;
k++;
}
}
if(j > mid){
while(k <= right){
a[i] = b[k];
i++;
k++;
}
}
if(k > right){
while(j <= mid){
a[i] = b[j];
i++;
j++;
}
}
}









