算法流程:分解数组,递归求解,合并排序。
-
将数组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++; } } }