排序——归并排序技术
归并排序的思想是将几个相邻的有序表合并成一个总的有序表,下面主要讨论二路归并排序。
1、两个有序表的合并
二路归并排序的基本操作是将两个相邻的有序表合并为一个有序表。下面是将两个顺序存储的有序表合并为一个有序表的算法:
设两个有限子表R[s]……R[m]和R[m+1]……R[t],将两个有序子表合并为一个有序表R1[s]……R1[t]。合并算法如下:
要注意:该合并算法要求两个有限子表是相邻的,即R[s]……R[m]和R[m+1]……R[t]。
2、二路归并排序的迭代算法
二路归并的基本思想是:只有一个元素的表总是有序的,所以将排序表R[1……n],看做是n个长度为len=1的有序子表,对相邻的两个有序子表两两合并到R1[1……n],使之生成表长len=2的有序表;再进行两两合并到R[1……n]中,……,直到最后生成表长len=n的有序表。
每趟排序中首先要解决分组的问题,设本趟排序中从R[1]开始,长度为len的子表有序,因为表长n未必是2的整数幂,这样最后一组就不能保证恰好是表长为len的有序表也不能保证每趟归并时都有偶数个有序子表,这些都要在一趟排序中考虑到。
例:有排序表36 20 18 10 60 25 30 18 12 56,归并排序过程如下图示:
一趟归并算法:
二路归并排序:
3、二路归并排序的递归算法