如何将未排序数组的排序索引放入新数组

时间:2016-02-22 02:46:38

标签: c++ arrays list sorting indexing

如果我有一个像array = {7, 4, 5, 8, 22}这样的数组,我想找到数组的排序索引,sortedIndicies = {2, 0, 1, 3, 4},我该怎么做呢?我对编码很新,而且我一直在尝试使用for循环和if语句。我尝试创建原始数组的副本,对新数组进行冒泡,然后将新排序数组中的值与原始数组进行比较并使用这些索引,但如果代码在数组中有多个相同元素,则会遇到问题。有什么建议? (以某种方式使用我最喜欢的fors和ifs。)先谢谢。

2 个答案:

答案 0 :(得分:4)

可能的解决方案是创建一对数组{value,index},按值排序(使用std::pair已经有适当的operator <)并从排序数组中读取索引。写起来应该很容易。

另一个解决方案是创建索引数组并使用第一个数组中的值对它们进行排序。在c ++ 11中,它可能如下所示:

template<class T>
std::vector<size_t> get_sorted_indexes(std::vector<T> const &array)
{
    std::vector<size_t> indexes(array.size());
    std::iota(indexes.begin(), indexes.end(), 0);
    std::sort(indexes.begin(), indexes.end(), [&array](size_t l_idx, size_t r_idx)
    {
        return array[l_idx] < array[r_idx];
    });
    return indexes;
}

iota用于填充索引向量。索引按原始数组[l_idx] < array[r_idx]

的值进行比较

是。这不是“fors and ifs”解决方案。但你不需要它们。只需按照您需要的方式使用sort功能

答案 1 :(得分:2)

首先,排序的索引是{1,2,0,3,4}

仅使用for,如果你可以这样做

#include <iostream>
using namespace std;

int main() {
    int arraySize = 5;

    int arr[arraySize] = { 7, 4, 5, 8, 22 };

    int arrtemp[arraySize] = { 0 };

    int temp;

    int sortedIndices[5];

    for (int i = 0; i < arraySize; i++) {
        arrtemp[i] = arr[i];               //making a copy of the original array
    }

    //Bubble sorting
    //Sorting the copied array
    for (int i = 0; i < arraySize; i++) {
        for (int j = 0; j < arraySize - 1; j++) {
            if (arrtemp[j] > arrtemp[i]) {
                //swap them
                temp = arrtemp[i];
                arrtemp[i] = arrtemp[j];
                arrtemp[j] = temp;
            }
        }
    }

    //tracking the location of the sorted values
    for (int i = 0; i < arraySize; i++)
        for (int j = 0; j < arraySize; j++) {
            if (arrtemp[i] == arr[j]) {
                sortedIndices[i] = j;
            }
        }

    cout << "Original Array\n";
    for (int i = 0; i < arraySize; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;

    cout << "Sorted array\n";
    for (int i = 0; i < arraySize; i++) {
        cout << arrtemp[i] << " ";
    }
    cout << endl;

    cout<<"Sorted indices are\n";
    for (int i = 0; i < arraySize; i++) {
        cout << sortedIndices[i] << " ";
    }
}
  

输出:

     

原始数组

     

7 4 5 8 22

     

排序数组

     

4 5 7 8 22

     

排序索引

     

1 2 0 3 4