Odd-even merge sort也是一种基于merge思想的排序算法。
对于merge类型的算法,只要知道如何merge,就知道如何排序。首先看odd-even merge。
假设现有x1,...,n和y1,...yn两个有序的数组,那么把x分成xodd和xeven两部分,也就是下标时奇数和偶数两部分,y同理,然后递归merge xodd和yodd,递归merge xeven和yeven,假设结果分别为z1=a1,a2,....和z2=b1,b2,.....,做一次shuffle,即逐一取z1中的一个再取z2中的一个得到a1,b1,a2,b2,......an,bn. 最后做一次compare-exchange,即b1,a2做调整,b2,a3做调整。。。merge结束。
所以整个排序过程大致为:
sort(x){
if base case;
sort(x1);
sort(x2);
merge(x1,x2);
}
merge(x1,x2){
if base case;
merge(x.odd,y.odd);
merge(x.even,y.even);
}
证明排序算法有效:
lemma:0-1定理,如果一个排序算法可以对任意的01序列排序,那么也可以对任意数字排序。
只需要证明merge部分即可。假设x中0的个数为n1,y中的0的个数为n2。那么z1中的0的个数为ceil(n1/2) + ceil(n2/2),z2中为floor(n1/2) + floor(n2/2),二者的差至多为2。下面分类讨论:
(1)如果差为0,那么最后exchange以后就是0000.。。。00011111.。。。。。111 , 有序。
(2)如果差为1,那么最后exchange以后仍然是有序,
(3)差为2,那么是0000...000...0101...1111...exchange会让第一个10交换,最终有序。