矢量元素按降序排序

时间:2019-06-21 21:50:20

标签: c++

请告诉我我的方法出了什么问题。 当我运行代码时,要花很长时间才能计算出结果。

#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,然后重复该过程。

2 个答案:

答案 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; });