归并排序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* 对记录数组 r[1..n]做归并排序 */
{
MSort ( r, 1, n, r );
}
【算法分析】
归并排序中一趟归并中要多次用到 2-路归并算法 9.12,一趟归并排序的操作是调
用 n 次算法 merge 将 r1[1…n]中前后相邻且长度为 h 的有序段进行两两归并,得到
2h
MSort ( r1,low, mid, r2);
wenku.baidu.com
MSort ( r1,mid+1,high, r2);
Merge ( r2,low,mid,high, r3);
} free(r2); } /* MSort */
【算法描述】
2-路归并排序的初始调用过程
void MergeSort ( RecordType r[ ], int n )
在合并过程中,两个有序的子表被遍历了一遍,表中的每一项均被复制了一次。因 此,合并的代价与两个有序子表的长度之和成正比,该算法的时间复杂度为 O(n)。
2-路归并排序可以采用递归方法实现: 【算法思想】将 r1[ ]中的记录用归并法排序后放到 r3[ ]中,可以分为下面三个 步骤: (1) 首先将 r1[ ]前半段的记录用归并法排序后放到 r2[ ]的前半段中; (2) 将 r1[ ]后半段的记录用归并法排序后放到 r2[ ]的后半段中; (3) 将 r2[ ]的前半段和后半段合并到 r3[ ]中。
{ RecordType *r2;
r2 = ( RecordType * ) malloc(sizeof ( RecordType ) * ( hight – low + 1 ));
if ( low == high ) r3[ low ] = r1[ low ];
else{
mid = ( low + high ) / 2;
前后相邻、长度为 2h 的有序段,并存放在 r[1…n]中,其 时间复杂度为 O(n)。整个
归并排序需 进行 m( m=log2n )趟 2-路归 并, 所以归并排 序总的 时间 复杂度为 O (nlog2n)。在实现归并排序时,需要和待排记录等数量的辅助空间,空间复杂度为 O(n)。
类似 2-路归并排序,可设计多路归并排序法。与快速排序和堆排序相比,归并排序
入外存,如此反复,直到整个待排序文件有序。
外部排序可使用磁带、磁盘等外存,最初形成有序子文件长取决于内存所能提供排
序区大小和最初排序策略,归并路数取决于能提供排序的外部设备数。
序列,存放在 r2[low..high] */
{
i=low;j=mid+1; k=low;
while ( (i<=mid)&&(j<=high) )
{
if ( r1[i].key<=r1[j].key )
{
r2[k]=r1[i] ; ++i; } else { r2[k]=r1[j] ; ++j; } ++k ; } while( i<=mid ) {r2[k]=r1[i];k++,i++;} while( j<=high); { r2[k]=r1[j];k++;j++;} } /* Merge */
序列。
【算法描述】
相邻两个有序子序列的合并成算法
void Merge ( RecordType r1[], int low, int mid, int high, RecordType r2[])
/* 已知 r1[low..mid]和 r1[mid+1..high]分别按关键字有序排列,将它们合并成一个有序
每个子序列的长度为 1,然后两两归并,得到 n / 2 个长度为 2(n 为奇数时,最后一
个序列的长度为 1)的有序子序列; 在此基础上,再对长度为 2 的有序子序列进行两两归并,得到若干个长度为 4 的有
序子序列; 如此重复,直至得到一个长度为 n 的有序序列为止。 这种方法被称作 2-路归并排序。 下图为一个 2-路归并实例。
第 6 讲.归并排序——教学内容讲义
前面介绍的三类排序方法:插入排序、交换排序和选择排序,都是将一组记录按关 键字大小排成一个有序的序列。而本节介绍的归并排序法,它的基本思想是基于合并, 将两个或两个以上有序表合并成一个新的有序表。下面以 2-路归并为例,介绍归并排序 算法。 【算法思想】假设初始序列含有 n 个记录,首先将这 n 个记录看成 n 个有序的子序列,
的最大特点是,它是一种稳定的排序方法。一般情况下,由于要求附加和待排记录等数
量的辅助空间,因此很少利用 2-路归并排序进行内部排序,归并的思想主要用于外部排
序。
外部排序可分两步,①待排序记录分批读入内存,用某种方法在内存排序,组成有
序的子文件,再按某种策略存入外存。②子文件多路归并,成为较长有序子文件,再进
(19) (13) (05) (27) (01) (26) (31) (16)
(13,19)
(05,27)
(01,26)
(16,31)
(05,13,19,27)
(01,16,26,31)
(01,05,13,16,19,26,27,31)
图 9.11 归并排序示例
2-路归并排序法的基本操作是将待排序列中相邻的两个有序子序列合并成一个有序
【算法描述】
2-路归并排序的递归算法
void MSort (RecordType r1[ ], int low, int high, RecordType r3[ ])
/* r1[ low …. high ]排序后放在 r3[ low …. high ]中,r2[ low …. high ]为辅助空间 */