2013-05-22 1 views
3

Предположим, у нас есть 2D массив A:Как отсортировать 2D-массив на основе определенного индекса в c/c?

A[3][3] = { {1 ,4 ,7}, 
       {6 ,2 ,3}, 
       {3 ,5 ,5} 
       } 

Я хочу, чтобы отсортировать его об индексе я (скажем, 1) результат должен быть

A[3][3] = { {6 ,2 ,3}, 
       {1 ,4 ,7}, 
       {3 ,5 ,5} 
       } 

сортировкой около 0 приведет к

A[3][3] = { {1 ,4 ,7}, 
       {3 ,5 ,5}, 
       {6 ,2 ,3} 
       } 

Как использовать функцию сортировки для этого?

ответ

1

Если вы используете C++ 11:

Выполните сортировку по колонке (col), как это:

int col = 1; 
std::sort(A, A+3, [=](const int* a, const int* b) 
{ 
    return a[col] < b[col]; 
}); 

Если вы используете C++ (т.е. до C++ 11):

Определить тип функтора для «менее» операций, как это:

class column_less 
{ 
    int col; 
public: 
    column_less(int col) : col(col) { } 
    bool operator()(const int* a, const int* b) const 
    { 
     return a[col] < b[col]; 
    } 
} 

Затем сделать сортировку на колонка (col), как это:

int col = 1; 
std::sort(A, A+3, column_less(col)); 

std::sort documentation

0

Try QSort, я считаю, что в stdlib.h Отсортировать указатели на первый элемент в каждой строке.

0

Предполагает, что ваш тип данных uint32_t. Затем вы хотите рассматривать это как сортирующие элементы, которые являются sizeof(uint32_t) * number_of_columns. Когда вы вызываете функцию сравнения, вы будете передавать ей элементы, которые являются большими. Функция сравнения смотрит на соответствующий элемент внутри того, что его передала (действительно, строка), а затем переупорядочивает элементы внутри строки.

2

В C:

QSort из stdlib.h сортирует массивы любой длины, и любого размера элемента, добиться того, что вы хотите, мы должны кормить его обе эти части информации, длина это число строк, а размер элемента - это число столбцов.

В дополнение к этим необходимо знать, как сравнивать элементы, qsort хочет, чтобы указатель функции с сигнатурой int (*) (void *, void *). Эта функция вызывается с указателями на каждый из элементов, который будет адресом первого числа в каждой строке, теперь нам просто нужно сравнить элемент выбора друг с другом. QSort ожидает, что число меньше нуля в случае, когда < В, ноль для A == B и больше нуля для А> В, это делается путем вычитания B от ,Поскольку мы получили указатели, мы можем просто отбросить их до int * и использовать операторов индексов для сравнения желаемой позиции друг против друга.

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 

const int sort_element = 1;// Choose a value from 0 to the column width 

int intcmp(const void *a, const void *b){ 
    const int *A = a; 
    const int *B = b; 
    return A[sort_element]-B[sort_element]; 
} 
int main(){ 
    int a[3][3] = { 
     {1 ,4 ,7}, 
     {6 ,2 ,3}, 
     {3 ,5 ,5} 
    }; 
    qsort(a, 3, sizeof(int)*3, intcmp); 
} 

Как вы видите, нам нужна одна функция сравнения для каждого элемента, с которым мы сортируем.

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