声明
此次图片不是本人原创,截图自本人 数据结构课程老师(尹老师)的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); //将左右两部分归并结果合并
}
}

1956

被折叠的 条评论
为什么被折叠?



