(QuickSort算法的)分区方法中的存储变量在做什么?

时间:2019-04-25 16:39:22

标签: java quicksort

我正在研究this的QuickSort算法的简单实现。

我在使用分区方法时遇到了麻烦。我已重命名变量以帮助我理解。我了解大多数方法,但是有一个我无法达到目的的变量。那就是store变量。

这是该方法的我版本:

private int partition(int[] array, int startIndex, int endIndex) 
{
        int pivotIndex = getPivot(startIndex, endIndex);
        swapElements(array, pivotIndex, endIndex);

        pivotIndex = endIndex;
        int store = startIndex;

        for(int currentIndex = startIndex; (currentIndex <= endIndex - 1); currentIndex++) 
        {
            if(array[currentIndex] <= array[pivotIndex]) 
            {
                swapElements(array, currentIndex, store);
                store++;
            }
        }

        swapElements(array, store, pivotIndex);
        pivotIndex = store;
        return pivotIndex;
}

store变量的用途是什么?如果startIndexcurrentIndex已经指向数组的第一个索引,为什么需要store做同样的事情?在做什么?

1 个答案:

答案 0 :(得分:1)

要回答一个更简单的问题,您应该能够看到随着迭代的进行storecurrentIndex并不相同。仅当array[currentIndex] <= array[pivotIndex]对特定迭代为true时,它才递增。 -因此store通常会小于currentIndex

要更具体地回答,这是在开始时您选择了指向某个值的pivotIndex。然后,您要在表中四处移动元素,以便所有小于pivotIndex值的值都在数组中该值之前,而所有大于pivotIndex值的值都在该值之后在数组中。 store跟踪下一个小于pivotIndex的值的位置。将该值移到store位置,然后将store递增以移过该值并表示应将下一个较小的值放置在何处。

在迭代结束时,由于store之前的所有值均小于该值,而{{1}之后的所有值均被设计为指向枢轴值应位于的位置}更大。因此,最后,将枢轴值移动到store所指向的位置,并且store成为分区操作的最终索引,该索引指向枢轴值