归并排序采用的是分而治之的思想。
分治模式有三个步骤:
分解(divide):把原问题分解为一系列子问题
解决(conquer):递归(recursive)地求解各子问题。若子问题足够小,则直接求解。
合并(combine):将子问题的结果合并成原问题的解。
二路归并排序的思路就是把序列分解成子序列,再递归使用合并排序法合并成一个有序序列。
void merge(int a[],int p,int q,int r)
{
int i,j;
int n1,n2,k;
n1 = q-p+1;
n2 = r-q;
int *left,*right;
left = (int*) malloc(n1*(sizeof(int)));
right = (int*)malloc(n2*(sizeof(int)));
for(i = 0,k = p;i<n1;i++,k++)
{
left[i] = a[k];
}
for(i = 0,k = q+1;i<n2;i++,k++)
{
right[i] = a[k];
}
for(i = 0,j = 0,k = p;i<n1&&j<n2;k++)
{
if(left[i]<right[j])
{
a[k] = left[i];
i++;
}
else
{
a[k] = right[j];
j++;
}
}
if(i<n1)
{
for(int t = i;t<n1;t++,k++)
a[k] = left[t];
}
if(j<n2)
{
for(int t = j;t<n2;t++,k++)
a[k] = right[t];
}
}
void mergsort(int a[],int start,int end)
{
if(start<end)
{
int h = (start+end)/2;
mergsort(a, start, h);
mergsort(a, h+1, end);
merge(a, start, h, end);
}
}
posted on
浙公网安备 33010602011771号