2015-11-24 5 views
0

Вы знаете, как сортировать многомерный массив в C++?Как отсортировать многомерный массив по столбцу в C++?

мой вход, как это:

Bogaerts_X 144 12 138 
Cespedes_Y 51 5 48 
Gomes_J  78 6 70 
Holt_B  106 4 98 
Napoli_M 119 17 133 
Nava_D  113 4 81 
Ortiz_D  142 35 95 
Pedroia_D 135 7 75 
Pierzynski_A72 4 40 
Ross_D  50 7 58 

И я хочу, чтобы отсортировать его в соответствии с 4-го столбца в порядке убывания, и мой код, включая функции сортировки(), как это:

#include <iostream> 
#include <fstream> //Required for fin.open, fin.close, fout.open, fout.close 
#include <cstdlib> //Required for srand(), rand(). 
#include <ctime> //Required for time(NULL) to seed the random num gen 

using namespace std; 


// Declaration of the main function 
int main() 
{ 
    ofstream fout; 
    ifstream fin; 
    string array[100][100]; 
    int limit(0); 

    fin.open("312.txt"); 

    cout << " -------------------------------" << endl << endl; 

    for (int i=0; i<12; ++i) //every row 
    { 
     for (int j=0; j<4; ++j)//every col 
     { 
      fin >> array[i][j]; 
     } 
    } 

    for (int i=0; i<12; ++i) //every row 
    { 
     for (int j=0; j<4; ++j)//every col 
     { 
      cout << "\t" << array[i][j]; 
     } 
     cout << endl; 
    } 


    //sort players according to the 4th column 




    //Asks the user for a limit of home runs to search by 
    cout << "Give me the limit of home runs to search by"<<endl; 
    cin >> limit; 


    //sorted alphabetically and displays 
    for (int i=0; i<limit; ++i) //every row 
    { 
     for (int j=0; j<4; ++j)//every col 
     { 
      cout << "\t" << array[i][j]; 
     } 
     cout << endl; 
    } 


    fin.close(); 

    cout << endl << endl << endl << endl << endl << endl << endl; 

    // Exit program. 
    return 0; 
} 

//This sample function sorts the array with n elements 
//into ascending order using selection sort 

void sort(const double a[], int n) 
{ 
    double temp; int m; int x[0]; 
    for (int k=0; k<=n-2; ++k) { 
     //find position of smallest element beginning at k 
     m = k; 
     for (int j=k+1; j < n-1; ++j) 
      if (a[j] < a[m]) 
       m = j; 
     //exchange smallest value with value at k 
     temp = x[m]; 
     x[m] = x[k]; 
     x[k] = temp; 
    } //end for (k) 
} //end sort() 

Как использовать эту функцию сортировки для сортировки по 4-й колонке? Я действительно смущен ...

+1

Я просто предлагаю вам использовать контейнер типа std для фиксированного размера или вектора, а затем использовать std sort funtion с лямбдой в качестве ключа. – Netwave

ответ

2

В массивах нет оператора присваивания копий. Поэтому вам нужно изменить структуру данных, используемую для хранения ваших данных.

Здесь показан Approch с использованием стандартной структуры данных std::array

#include <iostream> 
#include <array> 
#include <algorithm> 
#include <string> 
#include <iterator> 

int main() 
{ 
    std::array<std::string, 4> data[] = 
    { 
     { { "Bogaerts_X", "144", "12", "138" } }, 
     { { "Cespedes_Y", "51", "5", "48" } }, 
     { { "Gomes_J",  "78", "6", "70" } }, 
     { { "Holt_B",  "106", "4", "98" } }, 
     { { "Napoli_M", "119", "17", "133" } }, 
     { { "Nava_D",  "113", "4", "81" } }, 
     { { "Ortiz_D",  "142", "35", "95" } }, 
     { { "Pedroia_D", "135", "7", "75" } }, 
     { { "Pierzynski_A", "72", "4", "40" } }, 
     { { "Ross_D",  "50", "7", "58" } } 
    }; 

    for (const auto &row : data) 
    { 
     for (const auto &s : row) std::cout << s << ' '; 
     std::cout << std::endl; 
    } 

    std::cout << std::endl; 

    std::sort(std::begin(data), std::end(data), 
       [](const auto &a, const auto &b) 
       { 
        return std::stoi(a[a.size() - 1]) < std::stoi(b[b.size() - 1]); 
       }); 

    for (const auto &row : data) 
    { 
     for (const auto &s : row) std::cout << s << ' '; 
     std::cout << std::endl; 
    } 
}  

Выход программы

Bogaerts_X 144 12 138 
Cespedes_Y 51 5 48 
Gomes_J 78 6 70 
Holt_B 106 4 98 
Napoli_M 119 17 133 
Nava_D 113 4 81 
Ortiz_D 142 35 95 
Pedroia_D 135 7 75 
Pierzynski_A 72 4 40 
Ross_D 50 7 58 

Pierzynski_A 72 4 40 
Cespedes_Y 51 5 48 
Ross_D 50 7 58 
Gomes_J 78 6 70 
Pedroia_D 135 7 75 
Nava_D 113 4 81 
Ortiz_D 142 35 95 
Holt_B 106 4 98 
Napoli_M 119 17 133 
Bogaerts_X 144 12 138 

Если вы хотите, чтобы отсортировать массив в порядке убывания, то вызов из std :: sort будет выглядеть как

std::sort(std::begin(data), std::end(data), 
      [](const auto &a, const auto &b) 
      { 
       return std::stoi(b[b.size() - 1]) < std::stoi(a[a.size() - 1]); 
      }); 

Если ваш компилятор doe ы не поддерживает автоматический в лямбда-выражениях, чем вы должны встать в заданном тип параметров явно

[](const std::array<std::string, 4> &a, const std::array<std::string, 4> &b) 

Кроме того, вы могли бы рассмотреть возможность использовать массив std::tuple

Конечно вместо массив объектов станда: : массив или тип std :: tuple, вы можете использовать стандартный класс std::vector.

3

Это намного проще сортировать элементы, когда они сгруппированы в некоторую структуру.

struct Data 
{ 
    std::string name_; 
    int x_, y_, z_; 
}; 

int main() 
{ 
    std::vector<Data> data; 

    Data d1 = { "Bogaerts_X", 144, 12, 138 }; 
    Data d2 = { "Cespedes_Y", 51, 5, 48 }; 

    data.push_back(d1); 
    data.push_back(d2); 

    std::sort(std::begin(data), std::end(data), [](const Data& a, const Data& b) 
    { 
     // sort based on the last member variable or 4th column in your case 
     return a.z_ < b.z_; 
    }); 

    return 0; 
} 
+0

Как вы печатаете содержимое данных? –

0

Цель: сортировать записи (я имею в виду одну строку одной записи) 4-й колонкой. поэтому следующий шаг заключается в том, чтобы представить каждый отчет, очевидно, вам нужен тип комбинации, чтобы представить запись, например: (псевдокод)

class Record{ //成员变量 char *name; int age; int date; float score; Record(){/* constructure */} ~Record(){/* distructure*/} //成员函数 void sort(/*arguments*/){/*bubble sort . selection sort . quick sort*/} };

Следующий метод не рекомендуется: В Например, arr [0] [0] arr [0] [1] arr [0] [2] arr [0] [3] представляет первую запись, в то же время, arr [0] представляет строку [4]! У вас есть вдохновение? последующий псевдокод:

void bubble_sort(string ** array, int first_dimension_length, int sort_column){ string mini = "2100000000"; int mini_row = 0; string * swap = NULL; for(int i = 0; i < first_dimension_length; ++i){ for(int j = i + 1; i < first_dimension_length; ++j){ if(mini > array[j][sort_column]){ mini = array[j][sort_column]; mini_row = i; } } swap = array[i]; // swap point to one dimension array, that's swap is a pointer array[i] = array[mini_row]; //array[i] also point to one dimension array array[mini_row] = swap; //array[mini] also point to one dimension array } }

Одним словом, первый метод заслуживает вашего попробовать;

Смежные вопросы