在冒泡排序后显示向量中元素的原始索引

Showing the original index of an element in a vector after bubblesort

我是 c++ 的新手,我的代码有问题。我需要在排序之前显示向量的原始索引,排序之后。我这样试过:

#include <vector>
using namespace std;

void bubblesort(vector<int> &a, int n) {
    for (int j = 0; j < n - 1; j++) {
        for (int i = n - 1; i > j; i--) {
            if (a.at(i) < a.at(i-1)) {
                int aux = a.at(i);
                a.at(i) = a.at(i-1);
                a.at(i-1) = aux;
            }
        }
    }

}

int main()
{
    int n;
    cout << "Digite o tamanho do vetor: ";
    cin >> n;
    vector<int> v;
    vector<int> vold;
    vector<int> pos;

    for (int i = 0; i < n; i++) {
        int a;
        cin >> a;
        v.push_back(a);
        vold.push_back(a);
    }

    bubblesort(v, n);

    for (int i = 0; i < n; i++) {
        if (vold.at(i) == v.at(i)) {
            pos.push_back(i);
        }
        else {
            for (int j = i+1; j < n - 1; j++) {
                if (vold.at(i) == v.at(j)) {
                    pos.at(j) = i;
                    break;
                }
                
            }
            
        }
    }

    for (const int& i : pos) {
        cout << i << "  ";
    }

    

    system("pause>0");
}

但是没有用,如果有人能帮我看看我做错了什么,我会很高兴,在此先感谢。

如果您的目标是显示已排序向量的索引,那么另一种方法是不对原始向量进行排序,而是根据原始向量对索引值的向量进行排序。

索引向量将被初始化为 0、1、2 等,直到向量的大小减去 1。

这是一个例子:

#include <vector>
#include <numeric>
#include <iostream>

void bubblesort(std::vector<int> &a, std::vector<int>& index) 
{
    // Make sure the index vector is the same size as
    // the original
    index.resize(a.size());

    if ( a.size() <= 1 )
       return;

    // This is just a shortcut way of setting the values to 0,1,2,etc.
    std::iota(index.begin(), index.end(), 0);

    size_t n = a.size();

    // Here is your sort, but with one difference...
    for (size_t j = 0; j < n - 1; j++) 
    {
        for (size_t i = n - 1; i > j; i--) 
        {
            // Look at the comparison being done here using the index array
            if (a.at(index[i]) < a.at(index[i-1])) 
            {
                 // We swap the index values, not the values
                 // in the vector
                 int aux = index.at(i);
                 index.at(i) = index.at(i-1);
                 index.at(i-1) = aux;
            }
        }
    }
}

int main()
{
    std::vector<int> v = {3, 1, 65, 23, 4};
    std::vector<int> index;
    bubblesort(v, index);

    // Display the index values of the sorted items     
    for (const int& i : index) 
        std::cout << i << "  ";
}

输出:

1  0  4  3  2  

请注意,bubblesort 函数采用索引向量,而不是 n。不需要传递 n,因为向量已经通过 size() 函数知道了自己的大小。

输出显示每个已排序项目的原始索引。