算法导论一——关于MergeSort(归并排序)总结

来源:互联网 发布:手机淘宝么注册网店 编辑:程序博客网 时间:2024/05/29 02:43

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++];        }    }}
0 0
原创粉丝点击