以第一个元素为枢轴实现Quicksort分区算法

时间:2017-05-31 13:15:38

标签: algorithm

我正在尝试使用第一个元素作为枢轴实现快速排序分区算法,我已经研究了最后一个元素作为枢轴的Quicksort。有人可以告诉我下面的伪代码我错在哪里吗?

/* Taking first element of array as pivot and movig all elements 
smaller than pivot left to pivot and greater tto its right */
// L is leftmost index, R is rightmost index 

Partition(A[],L,R) 
{
    pivot = A[L]
    i = L-1
    for (j =L to R )
    {
        // If current element is smaller than or equal to pivot

        if (A[j] <= pivot)
        {
            i++;    // increment index of smaller element
            swap A[i] and A[j]
        }
    }
    swap A[i + 1] and A[L])
    return (i + 1)
}

4 个答案:

答案 0 :(得分:0)

经过一些试验和错误以及许多思考后,我发现了自己的错误。这是正确的算法。

Partition(A[],L,R) 
{
    pivot = A[L]
    i = L
    for (j =L+1 to R )
    {
        if (A[j] <= pivot)
        {
            i++;    // increment index of smaller element
            swap A[i] and A[j]
        }
    }
    swap A[i] and A[L])
    return (i)
}

答案 1 :(得分:0)

以下是“分区算法”的工作原理的简要概述: https://www.youtube.com/watch?v=MLpH7mpwOxQ

分区算法的目标是简单地获取一些元素集合(例如,您使用“数组”),然后围绕枢轴将这个集合划分(分为两个部分),即左部分和右部分

关于枢轴左侧和枢轴右侧的元素,应该有一些“规则”。例如,左侧的所有元素将小于所选的轴,而右侧的所有元素将大于轴。

希望这会有所帮助!

答案 2 :(得分:0)

@SiggiSv 根据您的答案,需要将“ R”加1,以便数组的最后一个元素也与数组一起排序,并且不会在您的代码之后被忽略

Partition(A[],L,R) 
{
    pivot = A[L]
    i = L
    for (j =L+1 to R+1 )
    {
        if (A[j] <= pivot)
        {
            i++;    // increment index of smaller element
            swap A[i] and A[j]
        }
    }
    swap A[i] and A[L])
    return (i)
}

答案 3 :(得分:0)

这是我在快速排序中使用的分区版本。 也适用于包含重复项的数组。 分区将枢轴(始终是第一个元素)放置在排序数组中的位置。假设左右枢轴的子数组已排序,工作完成。

int partition(int arr[],int p, int q) {
    int i = p;
    int j = q;
    int pivot = arr[p]; //choose pivot to be a first element
    while (i < j) {
        for (; arr[i] < pivot; i++); //iterate from the beginning till an element is larger or equals to pivot
        for (; arr[j] > pivot; j--); //iterate from the end till an element is less or equals to pivot

        if(i < j) {                 //if both for loops are done, arr[i] >= pivot and needs to be
                                    //on pivot's left. arr[j] <= pivot, so we throw it to pivot's right
            if(arr[i] == arr[j])
                i++;    //taking care of duplicates

            swap(arr[i], arr[j]);
        }
    }
    cout << j<<endl;            //now pivot is in its place as if array was sorted
    return j; //all elements on j's left are smaller than all elements on j's right
}

void quicksort(int arr[], int p, int r)
{
    if (p > r ) {
        return;
    }
    int q = partition(arr, p,  r);
    quicksort(arr, p, q-1); 
    quicksort(arr, q+1, r);
}