【Big data】Odd even merge sort

来源:互联网 发布:sqlserver 数据库阻塞 编辑:程序博客网 时间:2024/05/17 07:13

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交换,最终有序。

0 0