[英]c++ vector bubble sort
I use g++ -std=c++11 Sort.cpp to compile my file. 我使用g ++ -std = c ++ 11 Sort.cpp来编译我的文件。
My problem is the bubble sort don't sort. 我的问题是气泡排序不排序。
Maybe I'm passing the vector by value but I don't know is closely my firt time trying work with c++ and I chose use vector library. 也许我正在按值传递向量,但我不知道我是不是第一次尝试使用c ++,所以选择了使用向量库。
My code is: 我的代码是:
#include <iostream>
#include <vector>
using namespace std;
void bubbleSort(vector<int> a);
void printVector(vector<int> a);
int main(int argc, char const *argv[])
{
vector<int> a{3,2,6,1};
printVector(a);
bubbleSort(a);
printVector(a);
}
void bubbleSort(vector<int> a)
{
bool swapp = true;
while(swapp)
{
swapp = false;
for (int i = 0; i < a.size()-1; i++)
{
if (a[i]>a[i+1] )
{
a[i] += a[i+1];
a[i+1] = a[i] - a[i+1];
a[i] -=a[i+1];
swapp = true;
}
}
}
}
void printVector(vector<int> a)
{
for (int i=0; i <a.size(); i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
In the main I declare a vector type of int's and make the list {3,2,6,1} 在主体中,我声明了一个向量类型为int的类型,并制成了列表{3,2,6,1}
After that e call the function printVector
wich pretends print all numbers of vector on console and call bubbleSort
function and finally print again. 之后,调用函数printVector
假装在控制台上打印所有数量的vector并调用bubbleSort
函数,最后再次打印。
You need to pass by reference ; 您需要通过参考 ; by making a copy, you sort a temporary copy, and then that's it; 通过制作副本,您可以对临时副本进行排序,仅此而已; it disappears and the original is still unsorted, because, once again, you sorted only a temporary copy of the entire vector. 它消失了,原始图像仍未排序,因为再次, 您只对整个向量的一个临时副本进行了排序。
So change vector<int> a
to vector<int>& a
. 因此,将vector<int> a
更改为vector<int>& a
。
Here's the code, fixed: 这是固定的代码:
http://coliru.stacked-crooked.com/a/2f118555f585ccd5 http://coliru.stacked-crooked.com/a/2f118555f585ccd5
#include <iostream>
#include <vector>
using namespace std;
void bubbleSort(vector<int>& a);
void printVector(vector<int> a);
int main(int argc, char const *argv[])
{
vector<int> a {3,2,6,1};
printVector(a);
bubbleSort(a);
printVector(a);
}
void bubbleSort(vector<int>& a)
{
bool swapp = true;
while(swapp){
swapp = false;
for (size_t i = 0; i < a.size()-1; i++) {
if (a[i]>a[i+1] ){
a[i] += a[i+1];
a[i+1] = a[i] - a[i+1];
a[i] -=a[i+1];
swapp = true;
}
}
}
}
void printVector(vector<int> a){
for (size_t i=0; i <a.size(); i++) {
cout<<a[i]<<" ";
}
cout<<endl;
}
You are passing the vectors as values to your functions, meaning that you are sorting a copy, not the original vector, and then printing a copy of the original vector. 您正在将向量作为值传递给函数,这意味着您正在对副本(而非原始向量)进行排序,然后打印原始向量的副本。
Change the parameter to vector<int> &a
in the bubbleSort
function, and to vector<int> const &a
in the printVector
function (as you don't need to change the vector content from here). 更改参数vector<int> &a
在bubbleSort
功能,以及vector<int> const &a
在printVector
功能(因为你并不需要矢量内容从这里改变)。
By the way, your code may be affected by undefined behavior caused by signer integer overflow. 顺便说一句,您的代码可能会受到签名者整数溢出导致的不确定行为的影响。 You should use another method to swap your elements, std::swap
for example: 您应该使用另一种方法来交换元素,例如std::swap
:
std::swap(a[i], a[i + 1]);
I was stuck on it as well for sometime. 我也坚持了一段时间。 This question has already been answered fine by VermillionAzure, but still pasting my solution. VermillionAzure已经很好地回答了这个问题,但是仍然粘贴了我的解决方案。 I ain't using the std::swap just because I like to do more by hand. 我不使用std :: swap只是因为我喜欢用手做更多的事情。
#include <iostream>
#include <vector>
//function to swap values
//need to pass by reference to sort the original values and not just these copies
void Swap (int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void BubbleSort (std::vector<int> &array)
{
std::cout<<"Elements in the array: "<<array.size()<<std::endl;
//comparisons will be done n times
for (int i = 0; i < array.size(); i++)
{
//compare elemet to the next element, and swap if condition is true
for(int j = 0; j < array.size() - 1; j++)
{
if (array[j] > array[j+1])
Swap(&array[j], &array[j+1]);
}
}
}
//function to print the array
void PrintArray (std::vector<int> array)
{
for (int i = 0; i < array.size(); i++)
std::cout<<array[i]<<" ";
std::cout<<std::endl;
}
int main()
{
std::cout<<"Enter array to be sorted (-1 to end)\n";
std::vector<int> array;
int num = 0;
while (num != -1)
{
std::cin>>num;
if (num != -1)
//add elements to the vector container
array.push_back(num);
}
//sort the array
BubbleSort(array);
std::cout<<"Sorted array is as\n";
PrintArray(array);
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.