转载请注明出处:http://blog.youkuaiyun.com/ruoyunliufeng/article/details/27570953
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。
一.归并排序算法
/***************************************************************
*版权所有 (C)2014,公司名称。
*
*文件名称:归并排序法
*内容摘要:无
*其它说明:无
*当前版本:V1.0
*作 者:若云流风
*完成日期:2014.5.29
***************************************************************/
#include <stdio.h>
#include<stdlib.h>
#define N 8
void disp(void);
int a[N]={2,1,4,3,6,5,8,7};
//将有二个有序数列a[first...mid]和a[mid...last]合并。
void mergearray(int a[], int first, int mid, int last, int temp[])
{
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
printf("\n%d,%d,%d", i,m,n ); //打印first,mid,last
while (i <= m && j <= n)
{
if (a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while (i <= m)
temp[k++] = a[i++];
while (j <= n)
temp[k++] = a[j++];
for (i = 0; i < k; i++)
a[first + i] = temp[i];
disp(); //打印每次合并完的数组
}
/*递归的进行分解,然后合并*/
void mergesort(int a[], int first, int last, int temp[])
{
if (first < last)
{
int mid = (first + last) / 2;
mergesort(a, first, mid, temp); //左边有序
mergesort(a, mid + 1, last, temp); //右边有序
mergearray(a, first, mid, last, temp); //再将二个有序数列合并
}
}
//归并排序
bool MergeSort()
{
int *p;
p = (int *)malloc(N * sizeof(int)); //为了分配临时数组
if(p!=NULL)
{
mergesort(a, 0, N - 1, p);
free(p);
}
else
return false;
}
/*输出函数*/
void disp(void)
{
int i;
// printf("\n排序结果: \n");
printf("\n\n");
for(i=0;i<N;i++)
{
printf("%d", a[i]);
printf(" ");
}
}
int main(void)
{
MergeSort(); //归并排序
//disp();
return 0;
}
二.算法会说话
1.输出结果
2.总体过程分析
3.数组合并分析
现在以为第三个输出为例来说明数组是如何合并的: