Сортировка двумерного массива символов C ++ - PullRequest
2 голосов
/ 10 мая 2010

У меня есть двумерный массив символов, в котором в каждой строке я храню имя ..., например:

J O H N
P E T E R
S T E P H E N
A R N O L D
J A C K

Как мне отсортировать массив так, чтобы я получил

A R N O L D
J A C K
J O H N
P E T E R
S T E P H E N

Это двумерный массив символов ..... без строк и знаков с символами .....

Ответы [ 3 ]

2 голосов
/ 10 мая 2010
#define MAX_NAME 8

char names[][MAX_NAME] = {"JOHN", "PETER", "STEPHEN", "ARNOLD", "JACK"};
 // strcmp is really (int (*)(const char *, const char *)), so we cast.
qsort(names, sizeof(names) / MAX_NAME, MAX_NAME, 
  (int (*)(const void *, const void *)) strcmp);

Обратите внимание, что это, вероятно, не пузырьковая сортировка.

0 голосов
/ 10 мая 2010

C ++ не поддерживает копирование или сравнение массивов в стиле C, но он поддерживает такие операции с очень тонкими массивами в стиле C. Попробуйте boost::array, что совпадает с tr1::array и std::array в C ++ 0x.

Или сверните свое собственное:

#include <algorithm>

template< class T, size_t s >
struct array {
    T arr[s]; // public data, no destructor, inheritance, virtuals, etc
              // => type is aggregate
    operator T const *() const { return arr; }
    operator T *() { return arr; } // as close as we can get to array emulation

    friend bool operator< ( array const &l, array const &r )
        { return std::lexicographical_compare( l, l+s, r, r+s ); }
};

array< char, 10 > names[] // aggregate initialization — this is standard C++
    = { "JOHN", "PETER", "ARNOLD", "JACK" };

#include <iostream>
using namespace std;

int main() {
sort( names, names + sizeof names / sizeof *names );

for ( array<char,10> *s = names; s != names + sizeof names/sizeof*names; ++ s )
    cerr << *s << endl;
}

Если ваш компилятор не добавляет в указанную структуру дополнения безумно, вы можете безопасно reinterpret_cast массив в стиле C и array:

template< class T, size_t s >
array< T, s > &wrap_arr( T (&a)[s] ) {
    return reinterpret_cast< array<T,s> & >( a );

        // make sure the compiler isn't really wacky...
        // I would call this optional:
    BOOST_STATIC_ASSERT( sizeof( T[s] ) == sizeof( array<T,s> ) );
}

char names_c[][10] // or whatever C input from wherever
    = { "JOHN", "PETER", "ARNOLD", "JACK" };

array<char, 10> *names = &wrap_arr( names_c[0] );
0 голосов
/ 10 мая 2010

Не разбирайте пузырьки - точка № 1.

Точка номер два:

Сравните первый символ каждого подмассива (т.е. массив [x] [0]), если его необходимо сместить, затем сдвиньте все символов в подмассиве x, используя цикл while ... сохраняя вложенный массив и сдвигая его так ...

...