二路归并算法

来源:互联网 发布:linux 命令别名配置 编辑:程序博客网 时间:2024/06/05 09:49

声明

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

任务

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

原理

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

过程

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

这里写图片描述

两两合并

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

这里写图片描述

实现

C语言实现(核心代码)

#define NAME_LENGTH 20typedef 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); //将左右两部分归并结果合并    } }
原创粉丝点击