【笔记】归并排序
来源:互联网 发布:股票数据分析员 编辑:程序博客网 时间:2024/05/19 20:45
归并排序:是又一类不同的排序方法。“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。无论是顺序存储结构还是链表存储结构,都可在
基本算法思想:假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到
[n2] 个长度为2或1的有序子序列,再两两归并……如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2-路归并排序。
一趟归并排序的操作是,调用
递归形式的算法在形式上较简洁,但是实用性很差。与快速排序和堆排序相比,归并排序的最大特点是:它是一种稳定的排序方法。但在一般情况下,很少使用2-路归并排序法进行内部排序。
2-路归并排序中的核心操作是将一维数组中前后相邻的两个有序序列归并为一个有序序列,其算法如下所示。
- 类型定义
#include<stdio.h> #define EQ(a,b) ((a)==(b)) #define LT(a,b) ((a)<(b)) #define LQ(a,b) ((a)<=(b)) #define N 7 #define MAXSIZE 20 /* 一个用作示例的小顺序表的最大长度 */ typedef int InfoType; /* 定义其它数据项的类型 */ typedef int KeyType; /* 定义关键字类型为整型 */ typedef struct { KeyType key; /* 关键字项 */ InfoType otherinfo; /* 其它数据项,具体类型在主程中定义 */ }RedType; /* 记录类型 */ typedef struct { RedType r[MAXSIZE+1]; /* r[0]闲置或用作哨兵单元 */ int length; /* 顺序表长度 */ }SqList; /* 顺序表类型 */
- 归并排序函数
void Merge(RedType SR[],RedType TR[],int i,int m,int n) { /* 将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n] 算法10.12 */ int j,k,l; for(j=m+1,k=i;i<=m&&j<=n;++k) /* 将SR中记录由小到大地并入TR */ if LQ(SR[i].key,SR[j].key) TR[k]=SR[i++]; else TR[k]=SR[j++]; if(i<=m) for(l=0;l<=m-i;l++) TR[k+l]=SR[i+l]; /* 将剩余的SR[i..m]复制到TR */ if(j<=n) for(l=0;l<=n-j;l++) TR[k+l]=SR[j+l]; /* 将剩余的SR[j..n]复制到TR */ } void MSort(RedType SR[],RedType TR1[],int s, int t) { /* 将SR[s..t]归并排序为TR1[s..t]。算法10.13 */ int m; RedType TR2[MAXSIZE+1]; if(s==t) TR1[s]=SR[s]; else { m=(s+t)/2; /* 将SR[s..t]平分为SR[s..m]和SR[m+1..t] */ MSort(SR,TR2,s,m); /* 递归地将SR[s..m]归并为有序的TR2[s..m] */ MSort(SR,TR2,m+1,t); /* 递归地将SR[m+1..t]归并为有序的TR2[m+1..t] */ Merge(TR2,TR1,s,m,t); /* 将TR2[s..m]和TR2[m+1..t]归并到TR1[s..t] */ } } void MergeSort(SqList *L) { /* 对顺序表L作归并排序。算法10.14 */ MSort((*L).r,(*L).r,1,(*L).length); }
- 主程序
void print(SqList L) { int i; for(i=1;i<=L.length;i++) printf("(%d,%d)",L.r[i].key,L.r[i].otherinfo); printf("\n"); } void main() { RedType d[N]={{49,1},{38,2},{65,3},{97,4},{76,5},{13,6},{27,7}}; SqList l; int i; for(i=0;i<N;i++) l.r[i+1]=d[i]; l.length=N; printf("排序前:\n"); print(l); MergeSort(&l); printf("排序后:\n"); print(l); }
- 测试结果
阅读全文
0 0
- 算法笔记--归并排序
- 归并排序学习笔记
- 归并排序算法笔记
- 学习笔记-归并排序
- [笔记]:归并排序
- 【笔记】归并排序
- 算法学习笔记----归并排序
- 算法笔记之归并排序
- 归并排序算法学习笔记
- 算法笔记三:归并排序
- 自学笔记之归并排序
- 算法学习笔记--归并排序
- 归并排序-归并排序
- 笔记1--逆序对(归并排序)
- 算法笔记2——归并排序
- 基础算法学习笔记—归并排序
- 算法导论笔记——归并排序
- 归并排序-《算法导论》学习笔记二
- 比特币黄金Bitcoingold11月12日主网络启动,算法由sha256变更为Equihash
- dubbo服务注册
- 代理模式-动态代理
- dos命令复制文件
- 2.10.4Groovy使用@Lazy
- 【笔记】归并排序
- 搬瓦工搭建ss教程
- D4-记录
- 6.2
- 个人总结32
- shadowsocks在digitalocean上的正确安装
- iOS瀑布流
- Linux学习笔记之用QT界面操作板子LED
- linux常用命令