请告诉我我的方法出了什么问题。 当我运行代码时,要花很长时间才能计算出结果。
#include <iostream>
#include <vector>
using namespace std;
vector<int> vec;
vector<int> sort(vector<int> x) {
vector<int> y;
int i = 1;
reset:for(i = 1; i <= x.size(); i++){
for (int j = 1; j <= x.size();) {
if (j == i) {
j++;
}
else {
if (x[i - 1] > x[j - 1]) {
j++;
}
else {
i++;
goto reset;
}
}
}
y.push_back(x[i - 1]);
x.erase(x.begin() + i - 1);
}
return y;
}
int main(){
vec.push_back(5);
vec.push_back(9);
vec.push_back(3);
vec.push_back(6);
vec.push_back(2);
for (int i = 1; i <= vec.size(); i++) {
cout << sort(vec)[i-1] << " ";
}
}
我正在将这个给定的5个整数序列按降序排序。请帮忙。
我的计划是在整个向量x中搜索最大的整数,然后将其移到向量y,然后重复该过程。
答案 0 :(得分:2)
我认为您的sort
函数由于goto reset
语句而进入无限循环。如果您想实现一个简单的冒泡排序算法,可以这样做:
#include <iostream>
#include <utility>
#include <vector>
void bubble_sort(std::vector<int>& v) {
if(v.size() == 0) return;
for(int max = v.size(); max > 0; max--) {
for(int i = 1; i < max; i++) {
int& current = v[i - 1];
int& next = v[i];
if(current < next)
std::swap(current, next);
}
}
}
此函数获取一个向量,并且对于向量中的每个连续对元素,如果它们顺序混乱,则会交换它们。这导致最小的元素“冒泡”到向量的顶部。重复该过程,直到所有元素都按顺序排列为止。
如果我们对其进行测试,我们会看到它打印出正确的答案:
int main() {
std::vector<int> test = {5, 9, 3, 6, 2};
bubble_sort(test);
for(int i : test) {
std::cout << i << ' ';
}
std::cout << '\n';
}
std::sort
可以更快地做到这一点标准库提供了sort
函数,几乎可以对任何东西进行排序。 std::sort
的实现非常好,它比冒泡排序更有效,并且非常易于使用。
默认情况下,std::sort
以升序排序,尽管更改起来很容易,所以它以降序工作。有两种方法可以做到这一点。第一种方法使用反向迭代器对向量进行排序(这使您假装向量是反向的),第二种方法使用std::greater
对向量进行排序,这告诉std::sort
对事物进行反向排序订购。
// Way 1:
std::sort(test.rbegin(), test.rend());
// Way 2:
auto compare_func = std::greater<>();
std::sort(test.begin(), test.end(), compare_func);
我们可以使用std::sort
重新编写程序:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> test = {5, 9, 3, 6, 2};
auto compare_function = std::greater<>();
std::sort(test.begin(), test.end(), compare_function);
for(int i : test) {
std::cout << i << ' ';
}
std::cout << '\n';
}
答案 1 :(得分:1)
为什么不能只使用std:sort?您可以这样做:
sort(vec.begin(), vec.end(), [](const int a, const int b) {return a > b; });