Merge_Sort总结
在这个算法中,思想相对简单:
1. 首先将原有序列分解为两个小的序列,分别进行排序
2. 使用同1中的方法对两个序列进行操作
3. 合并两个已排序序列,生成一个有序序列
main.c
int main(void)
{
//将a中从下标0到10的序列进行排序
Mergesort(a,0,10);
}
mergesort.h
void Mergesort(int* a,int p,int r)
{//归并排序函数,p为排序下界,r为排序上界
int q = (p + r) / 2; //q为序列中间下标
if(p < r)//递归终止条件
{//若序列长度大于1,则分别对左右序列排序
Mergesort(a,p,q); //左边序列排序
Mergesort(a,q + 1,r); //右边序列排序
Merge(a,p,q,r); //合并左右得到有序序列
}
}
void Merge(int* a,int p,int q,int r)
{//合并a中左右两个序列,上界r,下界p,分界点q
//使用两个新的数组分别存放左右序列
int lenghtOfLarray = (q - p + 1); //左序列长度
int lengthOfRarray = (r - q); //右序列长度
//数组的最后一位作为哨兵,这样可以减少最后确认复制完成的操作步骤
//因为复制到最后的肯定不会大过INFINITY
int larray[lengthOfLarray + 1];
int rarray[lengthOfRarray + 1];
//将a中从p到r之间的元素分别复制到左数组中
for(int i = 0 ; i < lengthOfLarray ; ++i)
{
larray[i] = a[p + i]; //从p开始复制
}
larray[lengthOfLarray + 1] = INFINITY;
//将a中从p到r之间的元素分别复制到右数组中
for(int i = 0 ; i < lengthOfRarray ; ++i)
{
rarray[i] = a[q + 1 + i]; //从q的下一位开始复制
}
rarray[lengthOfRarray + 1] = INFINITY;
//将两个序列中的内容再合并到a中形成有序:
int l = 0; //左数组下标指针
int r = 0; //右数组下标指针
for(int i = 0;i < r - p + 1;++i)
{//总共有p~r的元素需要复制,故是r-p+1
if( larray[l] < rarray[r] )
{//哪个序列中的小就复制到a中
a[p + i] = larray[l++];
}
else
{
a[p + i] = rarray[r++];
}
}
}