归并排序
算法导论第二章就着重介绍的归并排序,充分体现了分治法的思想,同时也利用了递归。也是类比生活中洗牌的场景,十分生动形象。
具体代码:
void merge(int a[],int p ,int q,int r)
{
int i=0,j=0,k;
//左右新数组
int *LeftArray;
int *RightArray;
//左右数组大小
int size_left ,size_right;
size_left = q-p+1;
size_right = r-q;
//分配左右数组空间
LeftArray = (int*)malloc(sizeof(int)*size_left);
RightArray = (int*)malloc(sizeof(int)*size_right);
//分别复制a数组左右两边
for (i = 0;i < size_left ; i++)
{
LeftArray[i] = a[p+i];
}
for (j = 0;j < size_right ; j++)
{
RightArray[j] = a[q+j+1];
}
//memcpy(LeftArray,a,sizeof(size_left));
//memcpy(RightArray,a+q,sizeof(size_right));
i=0;j=0;
for(k=p;k<=r;k++)
{
if(i<size_left && j<size_right)
{
if(LeftArray[i] <= RightArray[j])
{
a[k] = LeftArray[i];
i++;
}
else if( j < size_right)
{
a[k] = RightArray[j];
j++;
}
}
else if(i < size_left)
{
a[k] = LeftArray[i];
i++;
}
else if( j < size_right)
{
a[k] = RightArray[j];
j++;
}
}
//回收申请的堆内存
free(LeftArray);
LeftArray = NULL;
free(RightArray);
RightArray = NULL;
}
void merge_sort(int a[],int p ,int r)
{
int mid;
if(p<r)
{
mid = (p+r)>>1;
merge_sort(a,p,mid);
merge_sort(a,mid+1,r);
merge(a,p,mid,r);
}
}
测试代码:
运行结果: