二路归并算法

声明

此次图片不是本人原创,截图自本人 数据结构课程老师(尹老师)的PPT。

任务

给出n个学生的考试成绩表,每条信息由姓名与分数组成,用归并排序算法编程实现

原理

将两个或两个以上的有序表组合成一个新有序表

过程

  • 初始序列看成n个有序子序列,每个子序列长度为1
  • 两两合并,得到 n/2 个长度为2或1的有序子序列
  • 再两两合并,重复直至得到一个长度为n的有序序列为止

这里写图片描述

两两合并

从两个子数组中,逐一比较,将两个中 大/小 的的那个放进大数组中,对应的指针后移一位。
这里写图片描述
这里写图片描述
这里写图片描述
。。。。。。。。
。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。

这里写图片描述

实现

C语言实现(核心代码)

#define NAME_LENGTH 20

typedef struct{
    char name[NAME_LENGTH];    //姓名
    float grade;               //成绩
}Data;

typedef struct{
    Data * data;               //信息数组
    int n;                     //人数
}Student;

void Merge(Data S[], Data T[], int start, int mid, int end)  //将两个数组合并,并排序
{      //将有序的S[start...mid]和S[mid+1.....end]归并为有序的T[start.....end]
    int i, j, k; 
    for(i = start, j = mid + 1, k = start; i <= mid && j <= end; k++)
    {  //任意一个“小数组”放置完了,就跳出循环
        if(S[i].grade > S[j].grade)//从大到小排,并入T[]中
            T[k] = S[i++];  
        else
            T[k] = S[j++];
    }
    while(i <= mid)                //将剩下的没放置的数组的元素放入T[中]
        T[k++] = S[i++];
    while(j <= end)
        T[k++] = S[j++];
    for(i = start; i <= end; i++)  //将归并的结果赋予原数组    
        S[i] = T[i];               //T[]只是一个辅助数组,真正要改变的是原数组S[]
}

void MSort(Data S[], Data T[], int start, int end)
 {     //归并排序,递归
    if(start < end)                 //排除只有一个元素的情况
    {
        int m = (start + end)/2;    //取得数组中点
        MSort(S, T, start, m);      //获取左半部分归并结果
        MSort(S, T, m + 1, end);    //获取右半部分归并结果
        Merge(S, T, start, m, end); //将左右两部分归并结果合并
    }
 }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值