C ++将向量传递给排序函数实际上并不对它进行排序

时间:2014-02-24 20:15:45

标签: c++ sorting vector

我有一个函数原型:

void bubbleSort(std::vector<float>);

和实施:

void bubbleSort(std::vector<float> inputVector)
{
    std::cout << "Executing bubble sort." << std::endl;
    int pass;
    int comparisons;
    float hold;

    for (pass = 1; pass < VECSIZE; pass++)
    {
        for (comparisons = 0; comparisons < VECSIZE - 1; comparisons++)
        {
            if (inputVector[comparisons] > inputVector[VECSIZE + 1])
            {
                hold = inputVector[comparisons];
                inputVector[comparisons] = inputVector[comparisons + 1];
                inputVector[comparisons + 1] = hold;
            }
        }
    }

    for (int i = 0; i < VECSIZE; i+=10)
    {
        std::cout << "Element " << i << " is " << inputVector[i] << std::endl;
    }
    return;
}

main

调用它
#define VECSIZE 1000
int main(void)
{
    std::string fileName = "randFloats.txt";
    std::cout << "Processing " << fileName << "..." << std::endl;
    std::ifstream fileInput(fileName);

    //vector to hold the floats
    std::vector<float> fltVector(VECSIZE);

    if(fileInput.is_open())
    {
        std::string line;
        int i = 0;
        while(getline(fileInput, line))
        {
            fltVector[i] = (::atof(line.c_str()));
            i++;
        }
    }
    bubbleSort(fltVector);
}

基本上,main函数接受一个1000个元素长的浮点文件,将其读入一个向量结构,然后将其发送到要排序的函数。由于我已经完成了某种语言指针的工作,所以已经太久了,所以当我将std::vector<float>传递给bubbleSort函数时,我发现它没有输出有序向量。我如何将向量传递给函数以使其排序?

这里需要冒泡排序...我只是出于自己的目的这样做,以便通过内存管理来恢复自我。

这是一个用于测试的输入文件: 1000 Line file

3 个答案:

答案 0 :(得分:5)

有几个问题。其中一些是:

  1. 向量按值传递,而不是按引用传递,因此您正在修改本地副本。

  2. 您正在访问越界数据:inputVector[VECSIZE + 1]不存在。

  3. 使用inputVector.size()代替使用VECSIZE宏。理想情况下,使用begin()end()和迭代器。

  4. 根本不需要VECSIZE。只需在阅读循环中附加向量:

    while(getline(fileInput, line)) 
        fltVector.push_back(::atof(line.c_str()));
    
  5. “自从我用语言中的指针完成任何工作已经太久了”它是C ++,你可以做很多而不用直接触摸指针:)

答案 1 :(得分:1)

您正通过值将矢量传递给您的函数:

void bubbleSort(std::vector<float>);

这意味着您要对矢量的副本进行排序,而不是实际的矢量。您需要将功能签名更改为

void bubbleSort(std::vector<float>&);
                                  ^ -- note the pass by reference

您遇到的另一个问题是您正在调用未定义的行为:

if (inputVector[comparisons] > inputVector[VECSIZE + 1])
                                           ^^^^^^^^^^^ -- accessing an element 2 beyond 

数组的大小,并且您没有交换正在比较的项目。

我认为你想要做的是:

bool swapped = false;
do
{
    swapped = false;
    for (int j = 0; j < inputVector.size() - 1; ++j)
    {
        if (inputVector[j + 1] > inputVector[j])
        {
            std::swap(inputVector[j + 1], inputVector[j]);
            swapped = true;
        }
    }
} while (swapped);

请注意此修复的问题:

if (inputVector[comparisons] > inputVector[VECSIZE + 1]) // UB
{
    hold = inputVector[comparisons];
    inputVector[comparisons] = inputVector[comparisons + 1]; // not swapping elements you compared!
    inputVector[comparisons + 1] = hold; // same problem as above!
}

答案 2 :(得分:0)

每次将最高元素放在最后,所以每次都不需要与数组的结尾进行比较:

bool swapped = false;
int k = inputVector.size();
do
{
    k--;
    swapped = false;
    for (int j = 0; j < k; j++)
    {
        if (inputVector[j] > inputVector[j + 1])
        {
            std::swap(inputVector[j], inputVector[j + 1]);
            swapped = true;
        }
    }
} while (swapped);