2016-02-21 74 views
2

我正在處理一個項目,我需要從最小到最大排序數組,但保存了索引的值。例如,對於數組{2,7,8,1,3},排序的索引將是{3,0,4,1,2}。我認爲我可以使用一個二維數組來完成這個任務;我會將索引添加到每個組件,對數組進行排序,然後從第二個元素中檢索原始索引。它並沒有爲我工作,雖然我希望儘管如此,我有我現在的代碼下面,它不斷給我一個分段錯誤。我不知道我做錯了什麼,但我假設它在我的循環中。使用多維數組跟蹤C++中的索引

#include <iostream> 
#include <algorithm> 

using namespace std; 

const int SIZE = 7; 

int main() 
{ 
    int intArray[SIZE] = {5, 3, 32, -1, 1, 104, 53}; 
    int i, j, k, l = 0; 
    int temp[SIZE][2]; 

    //fills multidimensional array temp with data from intArray or index # 
    for(i = 0; i < 7; i++){ 
    for(j = 0; j < 2; j++){ 
     switch (j) 
    { 
    case '0': 
     temp[i][j] = *intArray; 
     break; 
    case '1': 
     temp[i][j] = i; 
     break; 
     } 
    } 
    } 

    sort(intArray, intArray + SIZE); 

    //prints each component of temp individually 
    cout << "Sorted Array looks like this." << endl; 
    for (k = 0; i < 7; i++){ 
    for (l = 0; j < 2; i++){ 
     cout << &temp[k][l] << endl; 
    } 
    } 
    return 0; 
} 
+0

取決於你需要如何保持你的數據的跟蹤鏈接......我會用'的std :: pair'的'的std :: VECTOR' ('std :: vector >'),其中對中的第一個值是數組值,第二個值是數組索引。使用它,你應該能夠使用STL排序算法來排序你的矢量,並且你已經完成了。 – RyanP

+0

下面是我使用你的代碼提到的一個例子:http://ideone.com/hQZ7zk – RyanP

回答

1

下面的循環更簡單,做什麼它應該:

在你的代碼
for(i = 0; i < 7; i++){ 
    temp[i][0] = intArray[i]; 
    temp[i][1] = i; 
} 

一個錯誤是行

temp[i][j] = *intArray; 

這始終分配的intArray的第1個要素。

導致分段錯誤的東西可能是輸出語句中的&,只是將其刪除。

除此之外,我同意RyanP在評論中的建議。

0

使用std :: map。代碼將是最簡單的。在cpp.sh

#include <iostream> 
#include <map> 

int main() 
{ 
    std::map<int,int>arr = {{5,0}, {3,1}, {32,2}, {-1,3}, {1,4}, {104,5}, {53,6}}; 
    for(auto&x:arr) std::cout << x.first << " - > " << x.second << std::endl; 
    return 0; 
} 
+0

如果原始數組有重複元素,這將不起作用。 「std :: map」的鍵必須是唯一的。 –

+0

@Frank Puffer在任務中沒有對重複內容進行任何說明。但這並不重要。主要的事情 - 建議使用。要在std :: multimap上使用重複的基本替換std :: map。 –

+0

是的。我同意。而std :: map是分揀對的容器。 –

0

測試最後我用什麼弗蘭克河豚說,並選擇使用一個簡單的冒泡排序,而不是使用任何內置的功能。這是我的最終方案是什麼樣子http://ideone.com/cpEgGA

#include <iostream> 
#include <algorithm> 

using namespace std; 

const int SIZE = 7; 

int main() 
{ 
    int intArray[SIZE] = {5, 3, 32, -1, 1, 104, 53}; 
    int i, j, k, l, m = 0; 
    int temp2[SIZE][2]; 
    int indices[SIZE] = {}; 

    for(i = 0; i < 7; i++){ 
    temp2[i][0] = intArray[i]; 
    temp2[i][1] = i; 
    } 

    cout << "Unsorted Array looks like this." << endl; 
    for (j = 0; j < 7; j++){ 
    cout << temp2[j][0]; 
    cout << " : "; 
    cout << temp2[j][1] << endl; 
    } 

    for(k = 0; k < SIZE; k++) 
    { 
     for(j = 0; j < SIZE-1-k; j++) 
    { 
     if(temp2[j+1][0] < temp2[j][0]) 
     { 
      l = temp2[j][0]; 
      temp2[j][0] = temp2[j+1][0]; 
      temp2[j+1][0] = l; 
      l = temp2[j][1]; 
      temp2[j][1] = temp2[j+1][1]; 
      temp2[j+1][1] = l; 
     } 
    } 
    } 

    cout << "Sorted Array looks like this." << endl; 
    for (m = 0; m < SIZE; m++) 
    { 
     cout << temp2[m][0]; 
     cout << " : "; 
     cout << temp2[m][1] << endl; 
    } 

    for(i = 0; i < SIZE; i++){ 
    indices[i] = temp2[i][1]; 
    } 

    cout << "Indices of Sorted Array look like this." << endl; 
    for(i = 0; i < SIZE; i++){ 
    cout << indices[i] << endl; 
    } 

    return 0; 
}