二路归并算法
来源:互联网 发布: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); //将左右两部分归并结果合并 } }
阅读全文
0 0
- 二路归并算法
- 二路归并算法
- 二路归并算法
- 二路归并算法
- 二路归并排序算法
- 二路归并排序算法
- 二路归并排序算法
- 二路归并算法c#实现
- 排序算法之二路归并排序
- 实现二路归并排序算法
- 排序算法之二路归并排序
- 【数据结构与算法】二路归并排序
- 排序算法之二路归并排序
- 排序算法之二路归并排序
- 二路归并算法(参考) Java
- 二路归并算法的实现
- 经典算法之二路归并排序
- 插入排序算法&二路归并排序算法java实现
- python伪代码之爬取全国高校历年分数线运行代码持续更新:【内向即失败--王奕君】
- Docker chenyufeng/nginx-centos镜像实现负载均衡
- 用递归和非递归分别实现求第n个斐波那契数。
- 手把手玩转 ESP8266 Arduino系列
- 深度学习,windows平台环境搭建
- 二路归并算法
- 高数-线性代数
- 支配值数目问题
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)G.幼儿园战争
- 使用pm2部署node服务
- 怎样才能赚到钱系列(九):交流的价值
- 290. Word Pattern
- TX2更改内核
- MVP+Retrofit封装网络请求