归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。(来自百度百科的解释)
要求对递归函数有一定的理解
实现代码:
#include<iostream>
#define INF 99999999
using namespace std;
int L[20];
int R[20];
void merge(int a[],int left,int mid,int right)
{
int i;
int n1 = mid - left + 1; // 左边数组元素个数
int n2 = right - mid; // 右边数组元素个数
for(i = 0; i < n1; i++) //
{
L[i] = a[left+i];
}
for(i = 0; i < n2; i++)
{
R[i] = a[mid+i+1];
}
L[n1] = INF; // 将数组L与R的最后一个元素置为INF,就不用最后再检查一次某个数组是否读完
R[n2] = INF;
int l,r;
l = r = 0;
for(int k = left; k <= right; k++)
{
if(L[l] <= R[r])
{
a[k] = L[l++];
}else
{
a[k] = R[r++];
}
}
}
void merge_sort(int a[],int left,int right)
{
if(left < right)
{
int mid = (left + right) / 2;
merge_sort(a,left,mid);
merge_sort(a,mid+1,right);
merge(a,left,mid,right);
}
}
int main()
{
int a[6] = {3,2,1,8,7,9};
merge_sort(a,0,5);
for(int i = 0; i < 6; i++)
{
cout<<a[i]<<" ";
}
return 0;
}
PS:以后再来看,理解的不是很深刻