所以我今天和我的CS教授讨论了一下我的快速排序算法中的分区功能是否属于Hoare分区。根据她的说法,实现Hoare分区的方法只有一种,其他一切都是错误的。
这让我想知道,Hoare分区真的有一个特定的定义吗?我总是假设Hoare分区是使用Tony Hoare开发的方法排序的任何分区算法(即两个迭代器以相反的方向遍历列表);我认为算法的确切实现并不重要。这是正确的,还是只有一个"正确"实现Hoare算法的方法。
这是我的分区算法:
template <typename T>
int partArray(T* array, int leftIndex, int rightIndex)
{
int pivot = leftIndex, middle = (leftIndex + rightIndex) / 2, leftIterator = leftIndex + 1, rightIterator = rightIndex;
//Move median element into pivot position
if (array[leftIndex] > array[rightIndex])
SWAP(array[leftIndex], array[rightIndex]);
if (array[middle] > array[rightIndex])
SWAP(array[middle], array[rightIndex]);
if (array[middle] > array[leftIndex])
SWAP(array[middle], array[leftIndex]);
//Partition array using Hoare's algorithm
while (true)
{
while (array[leftIterator] <= array[pivot] && leftIterator < rightIndex) leftIterator++;
while (array[rightIterator] >= array[pivot] && rightIterator > leftIndex) rightIterator--;
if (leftIterator < rightIterator)
SWAP(array[leftIterator], array[rightIterator]);
else
break;
}
SWAP(array[pivot], array[rightIterator]);
//Return final position of pivot
return rightIterator;
}