У меня есть прототип функции:
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);
}
В основном, основная функция принимает файл с поплавками длиной 1000 элементов, считывает его в векторную структуру и отправляет его в функцию, подлежащую сортировке. Это было слишком долго, так как я проделал какую-либо работу с указателями на языке, поэтому, когда я bubbleSort
std::vector<float>
функции bubbleSort
, я обнаружил, что он не выводит отсортированный вектор. Как передать вектор функции, чтобы отсортировать ее?
Здесь нужна сортировка пузырьков... Я просто делаю это для своих целей, чтобы освежить себя с помощью управления памятью.
Здесь входной файл для тестирования: 1000 строк
Есть несколько проблем. Некоторые из них:
Вектор передается по значению, а не по ссылке, поэтому вы изменяете локальную копию.
Вы получаете доступ к данным за пределами границ: inputVector[VECSIZE + 1]
не существует.
Используйте inputVector.size()
вместо использования макроса VECSIZE
. В идеале используйте begin()
, end()
и итераторы.
Нет необходимости в VECSIZE
вообще. Просто добавьте вектор в цикл чтения:
while(getline(fileInput, line))
fltVector.push_back(::atof(line.c_str()));
"Прошло слишком много времени, так как я проделал какую-либо работу с указателями на языке" Это C++, вы можете много сделать, даже не касаясь указателя напрямую :)
Вы передаете вектор в свою функцию по значению:
void bubbleSort(std::vector<float>);
Это означает, что вы сортируете копию вектора, а не фактический вектор. Вам нужно изменить свою подпись функции на
void bubbleSort(std::vector<float>&);
^ -- note the pass by reference
Другая проблема заключается в том, что вы вызываете Undefined Behavior:
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!
}
Каждый раз, когда вы добавляете самый высокий элемент в конец, так что нет необходимости сравнивать с концом массива каждый раз:
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);
j == inputVector.size() - 1
.