首先上代码。
#include <iostream> using namespace std; int arr[11]; /*两个序列合并成一个序列。一共三个序列,所以用 3 根指针来处理。 i 是 low 到 mid 这个序列下标 序列 1 j 是 mid+1 到 high 这个序列下标 序列 2 k 代表新序列的下表 序列 3 */ void merge(int a[], int low, int mid, int high) { int i = low, j = mid+1, k =low; int b[11];//这里直接开大一点。省事 /*把序列 1 和序列 2 里面小的元素先放进序列 3 */ while(i <= mid && j <= high) if(a[i] <= a[j]) b[k++] = a[i++]; else b[k++] = a[j++]; /*如果序列 2 的元素先消耗完,那就把序列 1 里面的所有元素放进序列 3*/ while(i <= mid) b[k++] = a[i++]; /*如果序列 1 的元素先消耗完,那就把序列 2 里面的所有元素放进序列 3*/ while(j <= high) b[k++] = a[j++];
/*把序列 3 赋值给原来的序列*/ for(int i = low; i <= high; i++) a[i] = b[i]; } void mergesort(int a[], int low, int high) { int mid; if(low < high) { mid = (low + high)/2; mergesort(a,low,mid);//递归划分序列 mergesort(a,mid+1,high); merge(a,low,mid,high); } } int main() { for(int i = 1; i <= 10; i++) scanf("%d",&arr[i]); mergesort(arr,1,10); for(int i = 1; i <= 10; i++) cout<<arr[i]<<" "; cout<<" "; return 0; }
分治法一般分为三个步骤。1.分 2.治 3.合并。归并排序也是分治的思想,所以它也可以分为三步。
1.分。将大序列划为两个小序列(当然也可以多个)。一直划分到序列只有 1 个元素的时候停止。
2.治。因为停止时候序列元素只有 1 个,所以治这一步是没有体现出来的。
3.合并。这是归并排序的主要步骤。合并是将两个序列合并为一个有序序列。具体怎么合并,可以参考merge函数注释。