Всем привет,вообщем столкнулся с такой проблемой: нужно отсортировать матрицу по первому элементу ее столбцов. Пример: дана матрица А М Г Я Э Ж К М Ф П Р Н нужно получить:А Г М Я Э К Ж М Ф Р П Н Частичный код программы: 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; } } } Сортирую при помоши пузырька, но матрица не сортируется,а просто переворачивается тоесть из исходной матрицы получается Ф П Р Н Э Ж К М А М Г Я Заранее спасибо за помошь,помогите кто знает в чем проблема
не проверял, но должно работать: Код (Text): for (unsigned i = 0; i < N_COLS; ++i) { unsigned j_min = i; value_type x_min = table[0][j_min]; for (unsigned j = i+1; j < N_COLS; ++j) if (table[0][j] < x_min) x_min = table[0][j], j_min = j; for (unsigned k = 0; k < N_ROWS; ++k) { x_tmp = table[k][i]; table[k][i] = table[k][j_min]; table[k][j_min] = x_tmp; } }
без компиллера песал, так что может не скомпилицо, но суть, йа думою понятна Код (Text): ULONG i,j,ix=0,jx=0,im,jm; while((ix<N_COLS)&&(jx<N_ROWS)) { im=ix;jm=jx; for (i = ix; i < N_COLS; i++) for (j = jx; j < N_ROWS; j++) if (table[i][j]<table[im][jm]) { im=i; jm=j; } x_tmp = table[i][j]; table[i][j] = table[im][jm]; table[im][jm] = x_tmp; ix+=(++jx)/N_ROWS; jx%=N_ROWS; }
#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
Итак, код сравнивает элемент [j+1] с [j] и, если первый больше, то переставляет все элементы [j][*] с [j-1][*]. Что тут вообще имелось в виду? Вообще, существует несколько вариантов пузырьковой сортировки (хотя и очень похожих). Если table - это столбец и table[0] - первый элемент этого столбца, то исходный код можно модифицировать так: Код (Text): for( i=0; i <V_SIZE; i++) { for( int j = V_SIZE-1; j > i; j-- ) { if ( table[i][0] > table[j][0] ) { x=table[i]; table[i]=table[j]; table[j]=x; } } } а можно и так: Код (Text): for( i=0; i <V_SIZE; i++) { for( int j = V_SIZE-1; j > i; j-- ) { if ( table[j-1][0] > table[j][0] ) { x=table[j-1]; table[j-1]=table[j]; table[j]=x; } } }
Да, просто пароль на deniszp посеял, кароче не важно....вставил твой код и сортировка не работает, все компилится и запускается , но матрица не сортируется. Попробуй сам запусти.
Работает, только при таких условиях это сортировка строк по первому символу. Для сортировки именно по столбцам нужно либо изменить код так, чтобы table было именно столбцом, либо писать что-то типа Код (Text): for (i=0; i<KEY_SIZE; i++) { for (int j=KEY_SIZE-1; j>i; j--) { if (table[0][j-1] > table[0][j]) { for (k=0;k<V_SIZE;k++) { char x=table[k][j-1]; table[k][j-1]=table[k][j]; table[k][j]=x; } } } } (На всякий случай уточняю: матрица, данная в #6, уже отсортирована, и сортировка её не изменяет.)
diamond Возможно, Вы не поняли задание...ваш код сортирует матрицу по строчно...точнее каждую строку в порядке возрастания.
Код из #13? Вывод для случая char str[] = "ACBDEFGIM";: Переставляет второй и третий столбцы, после чего первые элементы всех столбцов - A,B,C,D - упорядочены.
Что собственно и было сделано в посте #2, только там перестановок поменьше. Не понимаю, что там может не работать.