Quick Sort function C ++ 1 parameter-矢量图

时间:2019-02-12 04:39:46

标签: c++ quicksort

我需要在C ++中实现Quicksort算法的帮助。我仅限于传递一个参数,即向量。到目前为止,我已经有了这段代码,但是它无法正常工作,因为它说复制功能出错。请帮我解决这个问题。谢谢。

template <class T>
vector<T> quickSort(vector<T> lst)
{
    double i = 0;
    double j = lst.size() - 2;
    double temp;
    int pivotIndex = lst.size() - 1;
    double pivot = lst[pivotIndex];

    if (lst.size() <= 1)
    {
        return lst;
    }

    while (i <= j)
    {
        while (lst[i] < pivot)
        {
            i++;
        }
        while (lst[j] > pivot)
            j--;

        if (i <= j)
        {
            temp = lst[i];
            lst[i] = lst[j];
            lst[j] = temp;
            i++;
            j--;
        }
    }

    lst[pivotIndex] = lst[i];
    lst[i] = pivot;
    pivotIndex = i;

    if (lst.size() <= 2)
        return lst;

    vector<T> left_vec, right_vec;

    vector<double>::iterator pivotIter = lst.begin() + pivotIndex;
    copy(lst.begin(), pivotIter, back_inserter(left_vec));
    copy(pivotIter + 1, lst.end(), back_inserter(right_vec));

    if (left_vec.size() > 0)
    {
        quickSort(left_vec);
        copy(left_vec.begin(), left_vec.end(), lst.begin());
    }

    if (right_vec.size() > 0)
    {
        quickSort(right_vec);
        copy(right_vec.begin(), right_vec.end(), pivotIter + 1);
    }

    return lst;
}

1 个答案:

答案 0 :(得分:0)

您的实现几乎没有什么问题。首先,vector<T>::iterator是一个从属。因此,在此之前使用typename。参见c++ dependents。接下来,向量索引应为整数(i and j),并且您可以对Tdouble使用模板参数temp而不是pivot,因为我相信您的意图是使其通用。

最后,在执行左右快速排序时,覆盖left_vecright_vec。尽管我更喜欢通过引用传递。

此外,您正在执行的复制操作有效地增加了快速排序的时间复杂度。由于只允许传递一个参数,因此请交叉检查您的问题陈述,是否可以使用任何全局变量,或者传递带有向量索引,低索引和高索引的struct

正确的实现。

#include <stdio.h>
#include <vector>
#include <iostream>

// should be avoided in general.
using namespace std;

template <class T>
vector<T> quickSort(vector<T> lst)
{
    int i = 0;
    int j = lst.size() - 2;
    T temp;
    int pivotIndex = lst.size() - 1;
    T pivot = lst[pivotIndex];

    if (lst.size() <= 1)
    {
        return lst;
    }

    while (i <= j)
    {
        while (lst[i] < pivot)
        {
            i++;
        }
        while (lst[j] > pivot)
            j--;

        if (i <= j)
        {
            temp = lst[i];
            lst[i] = lst[j];
            lst[j] = temp;
            i++;
            j--;
        }
    }

    lst[pivotIndex] = lst[i];
    lst[i] = pivot;
    pivotIndex = i;

    if (lst.size() <= 2)
        return lst;

    vector<T> left_vec, right_vec;

    typename vector<T>::iterator pivotIter = lst.begin() + pivotIndex;
    copy(lst.begin(), pivotIter, back_inserter(left_vec));
    copy(pivotIter + 1, lst.end(), back_inserter(right_vec));

    if (left_vec.size() > 0)
    {
        left_vec = quickSort(left_vec);
        copy(left_vec.begin(), left_vec.end(), lst.begin());
    }

    if (right_vec.size() > 0)
    {
        right_vec = quickSort(right_vec);
        copy(right_vec.begin(), right_vec.end(), pivotIter + 1);
    }

    return lst;
}

int main()
{
    vector<int> a{11, 8, 30, 21, 1, 5, 2};

    vector<int> res = quickSort(a);

    for(int  i = 0; i < res.size(); i++)
        cout<<res[i]<<" ";

    cout<<endl;

    return 0;
}