通过将递归之一替换为另一个函数来优化排序算法

问题描述

目前,我有以下排序算法:

public static void sort(int[] A,int i,int j) {
    if (i == j) return;
    if(j == i+1) {
        if(A[i] > A[j]) {
            int temp = A[i];
            A[i] = A[j];
            A[j] = temp;
        }
    } 
    else {
        int k = (int) Math.floor((j-i+1)/3);
        sort(A,i,j-k);
        sort(A,i+k,j);
        sort(A,j-k);
    }
}

排序正确,但是渐近比较非常高:T(n)= 3T(nf(floor(n / 3))和f(n)= theta(n ^(log(3/2)) 3)

因此,我目前正在考虑用新编写的迭代方法替换第三次递归sort(A,j-k),以优化算法。但是,我不太确定如何解决该问题,是否愿意收集一些想法。谢谢!

解决方法

如果我理解这是正确的,则首先对列表的前2/3进行排序,然后对最后2/3进行排序,然后再次对前2/3进行排序。这实际上是可行的,因为所有放错位置的项(实际上属于最后一个或前1/3的第一个或最后一个2/3中的项)都将被移位,然后在算法的下一遍正确排序。

肯定有两点可以优化:

  • 在最后一步中,前1/3和后1/3(以及要排序的区域的前半部分和后半部分)已经按照排序顺序进行了排序,因此您无需进行完整排序,就可以使用合并算法,该算法应在O(n)中运行
  • 与其对第一个和最后一个2/3进行排序,然后将重叠部分中的元素合并为前一个1/3,如上所述,您可以对前一个1/2和最后一个1/2进行排序,然后将它们合并零件,无重叠;数组的总长度是相同的(2/3 + 2/3 + 2/3与1/2 + 1/2 + 2/2),但是合并部分要比排序部分快/ li>

但是,在第二次“优化”之后,实际上您或多或少地重新发明了Merge Sort