Сортировка матрицы

Тема в разделе "WASM.BEGINNERS", создана пользователем deniszp, 20 сен 2008.

  1. deniszp

    deniszp New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2008
    Сообщения:
    6
    Всем привет,вообщем столкнулся с такой проблемой: нужно отсортировать матрицу по первому элементу ее столбцов.

    Пример: дана матрица А М Г Я
    Э Ж К М
    Ф П Р Н

    нужно получить:А Г М Я
    Э К Ж М
    Ф Р П Н

    Частичный код программы:
    for( i=0; i <V_SIZE; i++) {
    for( int j = V_SIZE-1; j > i; j-- ) {
    if ( table[j+1] > table[j] ) {
    x=table[j-1]; table[j-1]=table[j]; table[j]=x;
    }
    }
    }
    Сортирую при помоши пузырька, но матрица не сортируется,а просто переворачивается тоесть из исходной матрицы получается Ф П Р Н
    Э Ж К М
    А М Г Я

    Заранее спасибо за помошь,помогите кто знает в чем проблема:)
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    не проверял, но должно работать:
    Код (Text):
    1.     for (unsigned i = 0; i < N_COLS; ++i)
    2.     {
    3.         unsigned j_min = i;
    4.         value_type x_min = table[0][j_min];
    5.         for (unsigned j = i+1; j < N_COLS; ++j)
    6.             if (table[0][j] < x_min)
    7.                 x_min = table[0][j], j_min = j;
    8.         for (unsigned k = 0; k < N_ROWS; ++k)
    9.         {
    10.             x_tmp = table[k][i];
    11.             table[k][i] = table[k][j_min];
    12.             table[k][j_min] = x_tmp;
    13.         }
    14.     }
     
  3. deniszp

    deniszp New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2008
    Сообщения:
    6
    Не работает...может провериш у себя? Есть у кого-то еще варианты? Очень нужно.
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    без компиллера песал, так что может не скомпилицо, но суть, йа думою понятна
    Код (Text):
    1. ULONG i,j,ix=0,jx=0,im,jm;
    2.  
    3. while((ix<N_COLS)&&(jx<N_ROWS))
    4.     {
    5.         im=ix;jm=jx;
    6.         for (i = ix; i < N_COLS; i++)
    7.             for (j = jx; j < N_ROWS; j++)      
    8.                 if (table[i][j]<table[im][jm])
    9.                 {
    10.                     im=i;
    11.                     jm=j;
    12.                 }
    13.         x_tmp = table[i][j];
    14.         table[i][j] = table[im][jm];
    15.         table[im][jm] = x_tmp;
    16.  
    17.         ix+=(++jx)/N_ROWS;
    18.         jx%=N_ROWS;
    19.     }
     
  5. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    deniszp
    Каким образом задается table? лучше весь текст программы целиком.
     
  6. zoolus

    zoolus New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2008
    Сообщения:
    18
    #include <iostream>
    #include <windows.h>
    using namespace std;

    int main(int argc, char* argv[])
    {
    char tmp;
    char* x;

    char key[] = "Andd"; //размер матрицы
    char str[] = "ABCDEFGIM"; //содержимое матрицы
    int KEY_SIZE=strlen(key);
    int V_SIZE = strlen(str)/KEY_SIZE+1;

    char **table = new char*[KEY_SIZE];
    for( int i=0;i<KEY_SIZE;i++){
    table = new char[V_SIZE];
    }

    int k=0;

    for(i=0;i<V_SIZE;i++){
    for(int j=0;j<KEY_SIZE;j++){
    if(k<strlen(str)) table[j] = *(str+k++);
    else table[j] = '-';
    }
    }


    for( i=0;i<V_SIZE;i++){

    for(int j=0;j<KEY_SIZE;j++){

    cout<<table[j];
    }
    cout<<"\n";

    }

    cout<<"\n";
    for( i=0;i<KEY_SIZE;i++){
    for(int j=0;j<V_SIZE;j++){
    cout<<table[j];
    }

    }
    cout<<"\n";
    cout<<"\n";

    //-------------сортировка матрицы--------------------------------


    for( i=0; i <V_SIZE; i++) {
    for( int j = V_SIZE-1; j > i; j-- ) {
    if ( table[j+1] > table[j] ) {
    x=table[j-1]; table[j-1]=table[j]; table[j]=x;
    }
    }
    }

    for( i=0;i<V_SIZE;i++){

    for(int j=0;j<KEY_SIZE;j++){

    cout<<table[j];
    }
    cout<<"\n";

    }

    //-------------сортировка матрицы--------------------------------
    return 0;
    }

    Это код программы, коментариями обозначено тот блок который не работает.
    П.С: deniszp
     
  7. deniszp

    deniszp New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2008
    Сообщения:
    6
    Сверху изложен весь код, кто нибудь знает в чем проблема?
     
  8. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Итак, код сравнивает элемент [j+1] с [j] и, если первый больше, то переставляет все элементы [j][*] с [j-1][*]. Что тут вообще имелось в виду? Вообще, существует несколько вариантов пузырьковой сортировки (хотя и очень похожих).

    Если table - это столбец и table[0] - первый элемент этого столбца, то исходный код можно модифицировать так:
    Код (Text):
    1. for(  i=0; i <V_SIZE; i++) {          
    2.     for( int j = V_SIZE-1; j > i; j-- ) {    
    3.       if ( table[i][0] > table[j][0] ) {
    4.       x=table[i]; table[i]=table[j]; table[j]=x;
    5.     }
    6.   }
    7. }
    а можно и так:
    Код (Text):
    1. for(  i=0; i <V_SIZE; i++) {          
    2.     for( int j = V_SIZE-1; j > i; j-- ) {    
    3.       if ( table[j-1][0] > table[j][0] ) {
    4.       x=table[j-1]; table[j-1]=table[j]; table[j]=x;
    5.     }
    6.   }
    7. }
     
  9. zoolus

    zoolus New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2008
    Сообщения:
    18
    Это просто сортировка пузырьком....но ее нада как-то довести доума, которого у меня не хватает:)
     
  10. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    дописал предыдущий свой пост

    А zoolus и deniszp - одно и то же лицо?
     
  11. zoolus

    zoolus New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2008
    Сообщения:
    18
    Да, просто пароль на deniszp посеял, кароче не важно....вставил твой код и сортировка не работает, все компилится и запускается , но матрица не сортируется. Попробуй сам запусти.
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    diamond
    Ваш первый вариант сортировки - это не пузырьком. Это простыми вставками.
     
  13. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Работает, только при таких условиях это сортировка строк по первому символу. Для сортировки именно по столбцам нужно либо изменить код так, чтобы table было именно столбцом, либо писать что-то типа
    Код (Text):
    1. for (i=0; i<KEY_SIZE; i++)
    2. {
    3.     for (int j=KEY_SIZE-1; j>i; j--)
    4.     {
    5.         if (table[0][j-1] > table[0][j])
    6.         {
    7.             for (k=0;k<V_SIZE;k++)
    8.             {
    9.                 char x=table[k][j-1]; table[k][j-1]=table[k][j]; table[k][j]=x;
    10.             }
    11.         }
    12.     }
    13. }
    (На всякий случай уточняю: матрица, данная в #6, уже отсортирована, и сортировка её не изменяет.)
     
  14. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Хм... действительно, спасибо за поправку.
     
  15. zoolus

    zoolus New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2008
    Сообщения:
    18
    diamond Возможно, Вы не поняли задание...ваш код сортирует матрицу по строчно...точнее каждую строку в порядке возрастания.
     
  16. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Код из #13?
    Вывод для случая char str[] = "ACBDEFGIM";:
    Переставляет второй и третий столбцы, после чего первые элементы всех столбцов - A,B,C,D - упорядочены.
     
  17. zoolus

    zoolus New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2008
    Сообщения:
    18
    Извени, я туплю уже наверное просто или спать хочу, спасибо большое все работает.
     
  18. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Что собственно и было сделано в посте #2, только там перестановок поменьше. Не понимаю, что там может не работать.