快速分区的特殊问题

时间:2016-08-09 05:47:27

标签: quicksort partitioning

今天,在尝试快速排序时,我没有将最后一个元素作为枢轴和分区,而是将第一个元素作为枢轴,但它没有产生正确的分区输出。

int pivot = ar[0];
int pindex = 0;

for(int  i = 0;i < ar.size();i++)
{
    if(ar[i] <= pivot)
    {
        swap(ar[i],ar[pindex]);
        pindex++;
    }
}
swap(ar[pindex],ar[ar.size()-1]);

我无法理解为什么,我总是将它用于分区,但是当我将第一个元素作为分区时,这不起作用。

但即使我把第一个元素作为分区

,这也有效
int i, j, pivot, temp;
pivot = ar[0];
i = 0;
j = ar.size()-1;
while(1)
{
    while(ar[i] < pivot && ar[i] != pivot)
        i++;
    while(ar[j] > pivot && ar[j] != pivot)
        j--;
    if(i < j)
    {
        temp = ar[i];
        ar[i] = ar[j];
        ar[j] = temp;
    }
    else
    {
        break;
    }
}

它们之间有什么区别。

1 个答案:

答案 0 :(得分:0)

最后发现,这个方法是Hoare的分区方法,我们都遵循的典型快速排序方法是lomuto的分区。

请参阅此Wiki页面,其中包含所有详细信息https://en.wikipedia.org/wiki/Quicksort