上一篇文章中给出了可对任意长度的序列进行排序的双调排序的程序实现,这篇文章将对程序进行解析,通过与归并排序的对比有助于对程序的理解。
首先回顾一下归并排序的程序实现:
public class MergeSorter
{
private int[] a;
private final static boolean ASCENDING=true; // sorting direction
public void sort(int[] a)
{
this.a=a;
mergeSort(0, a.length, ASCENDING);
}
private void mergeSort(int lo, int n, boolean dir)
{
if (n>1)
{
int m=n/2;
mergeSort(lo, m, dir);
mergeSort(lo+m, n-m, dir);
merge(lo, n, dir);
}
}
private void merge(int lo, int n, boolean dir)
{
if (n>1)
{
int m=n/2;
for (int i=lo; i<lo+m; i++)
{
if (dir==(a[i]>a[lo+m]))
{
exchange(i,lo+m);
int k=lo+m;