分治法——归并排序(mergesort)

首先上代码。

#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函数注释。

原文地址:https://www.cnblogs.com/stul/p/10478919.html